我正在为一个新项目编写一个PDO包装器。与SQL一个很常见的模式是写一个声明,如使用while循环遍历发生器
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
的发电机,还是我在某处弄糊涂了?
这是因为发电机不是可穿越的物体。像这样想:一个可遍历的对象需要一些已知数量的元素可以迭代。对于查询的结果集,情况并非如此。该对象并不知道它包含多少条目,因为它不包含所有这些条目。有很好的理由。 – arkascha