2016-03-15 74 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