在學習Pdo的過程中發現一個問題,PDOStatement可以直接Foreach輸出查詢結果,如下:
foreach($dbh->query('SELECT * from FOO') as $row) {
print_r($row);
}
將其var_dump出來是這個樣子:
object(PDOStatement)#2 (1) {
["queryString"]=>
string(25) "select * from studentinfo"
}
在網路上找到一個類可以實現Iterator接口來讓Foreach可以遍歷,但這樣的確可以,但透過var_dump輸出的明顯跟PDOStatement不同:
object(Owi)#1 (2) {
["data":"Owi":private]=>
array(3) {
[0]=>
string(5) "apple"
[1]=>
string(9) "microsoft"
[2]=>
string(5) "nokia"
}
["pointer":"Owi":private]=>
int(0)
}
然後我翻看了官方手冊中PDOStatement的描述,發現其實現了Traversable接口,但手冊中描述這是一個空的接口。
於是我透過
var_dump($owi instanceof Traversable);
來檢查我這個類(實現Iterator接口)是否是Traversable的派生類,結果是 True
但我嘗試直接
implements Traversable
的時候會報錯,告知我必須使用Iterator來實現。
那麼,我現在就一頭霧水了,PDOStatement究竟是如何實現Foreach迭代的呢?
還望各位朋友指教!
已經解決了這個問題,父類實現
Iterator
或者IteratorAggregate
之後,子類就可以implements Traversable
了!感謝吾師!
你看了手册, 怎么不多看看
手册上不是说了: