【问题标题】:Iterating over generators with while使用 while 迭代生成器
【发布时间】:2016-07-01 01:48:00
【问题描述】:

我正在为一个新项目编写 PDO 包装器。 SQL 的一个非常常见的模式是编写一个语句,例如

while ($row = $connection->fetch($sql)) {
    ...
}

我的包装函数本质上是这样的:

public function fetch($query, $bindings)
{
    $stmt = $this->getPdo()->prepare($query);

    $stmt->execute($bindings);

    $stmt->setFetchMode($this->getFetchMode());

    foreach ($stmt as $record) {
        yield $record;
    }
}

但如果我使用上面的while 循环调用它,我将无法使用这些值。执行var_dump 表示$row 是一个生成器对象。如果我使用foreachvar_dump 会按预期显示数据库数据。使用while 是根本无法遍历生成器,还是我在这里的某个地方感到困惑?

【问题讨论】:

  • 那是因为生成器不是可遍历的对象。可以这样想:一个可遍历的对象需要一些已知数量的可以迭代的元素。对于查询的结果集,情况并非如此。该对象知道它包含多少条目,因为它不包含所有这些条目。有充分的理由。

标签: php pdo php-generators


【解决方案1】:

是否根本不可能使用 while 遍历生成器,还是我在这里的某个地方感到困惑?

您自己弄糊涂了;)在您的代码示例中:

while ($row = $connection->fetch($sql)) {

您实际上为循环的每次迭代执行fetch()。对于生成器,您通常使用foreach()

foreach ($connection->fetch($sql) as $row) {

【讨论】:

  • 谢谢,这很有道理,当时我无法获得足够的距离来看到它
猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 2023-03-20
相关资源
最近更新 更多