我正在爲一個新項目編寫一個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