【发布时间】: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 是一个生成器对象。如果我使用foreach,var_dump 会按预期显示数据库数据。使用while 是根本无法遍历生成器,还是我在这里的某个地方感到困惑?
【问题讨论】:
-
那是因为生成器不是可遍历的对象。可以这样想:一个可遍历的对象需要一些已知数量的可以迭代的元素。对于查询的结果集,情况并非如此。该对象不知道它包含多少条目,因为它不包含所有这些条目。有充分的理由。
标签: php pdo php-generators