2016-03-15 76 views
1

我正在为一个新项目编写一个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的发电机,还是我在某处弄糊涂了?

+1

这是因为发电机不是可穿越的物体。像这样想:一个可遍历的对象需要一些已知数量的元素可以迭代。对于查询的结果集,情况并非如此。该对象并不知道它包含多少条目,因为它不包含所有这些条目。有很好的理由。 – arkascha

回答

1

是不是可以使用while来遍历生成器,或者我是否在某处弄糊涂了?

你混淆自己;)在您的代码示例:

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

你实际上是在循环的每次迭代执行fetch()。使用通常使用的发电机foreach()

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

谢谢,这是有道理的,我无法获得足够的距离,在当时看到它 – charmeleon