PDOStatement是怎樣被Foreach直接遍歷的?

发布于 2022-09-03 23:55:24 字数 991 浏览 6 评论 0

在學習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迭代的呢?
還望各位朋友指教!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

猫九 2022-09-10 23:55:24

已經解決了這個問題,父類實現Iterator或者IteratorAggregate之後,子類就可以implements Traversable了!

class A implements IteratorAggregate
{
    public function getIterator(){}
}

class B extends A implements Traversable
{
    //这样就可以了
}

感謝吾師!

逆光下的微笑 2022-09-10 23:55:24

你看了手册, 怎么不多看看

clipboard.png

手册上不是说了:

实现此接口的内建类可以使用 foreach 进行遍历而无需实现 IteratorAggregate 或 Iterator 接口。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文