Вчера я узнал, что PHP имеет yield()
метод. Я был не уверен насчет его полезности в PHP.
Коллега сказал, что это может помочь для операторов SQL, возвращающих много строк, которые могут вызвать проблемы с памятью Я считаю, что он ссылался на fetchAll()
,
Но вместо того, чтобы использовать fetchAll()
можно также использовать fetch()
и обрабатывать строки один за другим. Так, yield()
не является ключом к решению проблемы, о которой он говорит.
Я что-то упустил yield()
против fetch()
Вот? Есть ли больше преимуществ в использовании yield()
а генераторы?
P.S .: Это правда, что в больших приложениях легче писать чистый, читаемый и пригодный для использования код с yield()
чем с fetch()
,
Таким образом, yield () не является ключом к решению проблемы, о которой он говорит.
Именно так.
Но это может позволить вам замаскировать while()
/fetch()
последовательность как foreach()
звоните, если хотите, без лишних затрат памяти.
Тем не менее, PDO не очень хороший пример, потому что PDOStatement
уже реализует перемещаемый интерфейс и, таким образом, может быть повторен с помощью foreach ():
$stmt = $pdo->query('SELECT name FROM users');
foreach ($stmt as $row)
{
var_export($row);
}
Итак, давайте возьмем mysqli для примера API, который может передавать результаты только один за другим.
редактировать. На самом деле, с 5.4.0 mysqli поддерживает Traversable также нет смысла использовать yield с mysqli_result. Но давайте сохраним это для демонстрации.
Давайте создадим такой генератор
function mysqli_gen (mysqli_result $res)
{
while($row = mysqli_fetch_assoc($res))
{
yield $row;
}
}
и теперь вы можете получить строки, используя foreach без накладных расходов:
$res = $mysqli->query("SELECT * FROM users");
foreach (mysqli_gen($res) as $row)
{
var_export($row);
}
Других решений пока нет …