PHP 产量与 PDO 获取?

PHP yield vs PDO fetch?

昨天,我了解到 PHP 有一个 yield() 方法。我不确定它在 PHP.

中的用处

一位同事说,它可以帮助 SQL 语句返回许多行,从而导致潜在的内存问题。我相信他指的是 fetchAll()。 但是,除了使用 fetchAll(),还可以使用 fetch() 并逐行处理。所以,yield()并不是解决他所指问题的关键。

我是不是漏掉了一些关于 yield()fetch() 的东西?使用 yield() 和生成器是否有更多好处?

P.S.: 的确,在大型应用程序中使用 yield() 比使用 [=14 更容易编写干净、可读和可维护的代码=].

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 也是如此,所以将 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);
}