2017-01-02 96 views
1

有一个下面的代码:PDOStatement对象在foreach循环PHP

<?php 

    include 'connection.php'; //$db is declared here. It's a PDO object. 

    foreach ($db->query("SELECT * FROM names") as $row) { 
     echo $row['firstname'] . $row['lastname'] . $row['postcode'] . '<br>'; 
    } 

?> 

的代码按预期工作,但我不明白它背后的逻辑。

我在php.net上看过PDO::query()返回一个PDOStatement对象作为结果集。因此在理论上,这个部分:$db->query("SELECT * FROM names")是一个PDOStatement对象。

foreach如何通过PDOStatement对象循环?它是否将PDOStatement对象转换为关联数组?为什么不是这部分:$db->query("SELECT * FROM names") as $row给出错误?

回答

2

PDOStatement implements Traversable接口,这意味着它可以在foreach循环内使用。

+0

好的,现在有道理。但是,如何将结果集存储在'PDOStatement'对象内?在[PDOStatement](http://php.net/manual/en/class.pdostatement.php)的php.net描述中,我没有看到任何可以保存结果集值的属性。 @Yuri Fedorov – qazerty23

+1

我想结果集是封装并隐藏起来的,但您可以尝试在源代码中找到它:https://github.com/php/php-src/blob/master/ext/pdo /pdo_stmt.c –