用while迭代生成器

时间:2016-03-15 14:39:23

标签: php pdo php-generators

我正在为一个新项目编写一个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是一个Generator对象。如果我使用foreach,则var_dump会按预期显示数据库数据。是否根本不可能使用while遍历生成器,或者我在某处混淆了自己?

1 个答案:

答案 0 :(得分:1)

  

是否根本不可能使用while来遍历生成器,或者我在某处混淆了自己?

您已经混淆了自己;)在您的代码示例中:

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

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

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