昨天,我了解到
PHP有一个yield()方法.我不确定它在PHP中的用处.
一位同事表示,它可以帮助sql语句返回许多行,从而导致潜在的内存问题.我相信他正在引用fetchAll().
但是,不是使用fetchAll(),也可以使用fetch()并逐个处理行.因此,yield()不是解决他所指的问题的关键.
我错过了关于yield()vs fetch()的内容吗?使用yield()和generator有更多好处吗?
P.S.:与使用fetch()相比,使用yield()在大型应用程序中编写干净,可读和可维护的代码更容易.
So,yield() is not key to solving the issue he is referring to.
究竟.
但它可以让你伪装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也是如此,所以使用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); }