昨天,我了解到PHP有yield()
方法。我不确定它在PHP中的用处。
一位同事表示,它可以帮助SQL语句返回许多行,从而导致潜在的内存问题。我相信他在提到fetchAll()
。
但是,您可以使用fetchAll()
并逐个处理行,而不是使用fetch()
。因此,yield()
并不是解决他所指的问题的关键。
我在这里遗漏了yield()
vs fetch()
的内容吗?使用yield()
和生成器有什么好处吗?
P.S。:确实,使用yield()
而不是使用fetch()
在大型应用程序中编写干净,可读且可维护的代码更为容易。
答案 0 :(得分:10)
因此,yield()不是解决他所指的问题的关键。
完全。
但如果你愿意的话,它可以让你把while()
/ fetch()
序列伪装成foreach()
来电,而且没有内存开销。
但是,PDO不是一个很好的例子,因为PDOStatement
已经实现了一个可遍历的接口,因此can be iterated over using foreach():
$stmt = $pdo->query('SELECT name FROM users');
foreach ($stmt as $row)
{
var_export($row);
}
所以让我们把mysqli用于只能逐个传输结果的示例API。
修改即可。实际上,since 5.4.0 mysqli supports 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);
}