foreach真的仅能用于数组?

aqibof1222 发布于 2013/06/03 22:02
阅读 321
收藏 0
PHP
$stmt = $pdo->query('select * from user'); //$pdo是获得的一个pdo数据库连接对象 
echo getType($stmt) //Object

$stmt是一个对象,具体说是PDOStatement对象。

print_r($stmt); //PDOStatement Object ([queryString] => select * from user)

但是$stmt却可以用foreach输出

foreach($stmt as $rs)
{                 

print_r($rs);                                                               

}

结果为:

Array ( [id] => 1 [0] => 1 [name] => yxb [1] => yxb )                                                                          Array ( [id] => 2 [0] => 2 [name] => beiwei [1] => beiwei )

这样就有一个矛盾:

foreach仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。--php手册

请问这该怎么理解?

加载中
0
狂飙的小蜗牛
狂飙的小蜗牛
自PHP 5 起,还可能 遍历对象
0
大尾巴
大尾巴
http://cn2.php.net/manual/zh/class.arrayobject.php
0
南湖船老大
南湖船老大

明显不看手册,任何实现了迭代器接口的object都能用foreach循环。这是PHP5从其它面向对象的语言里借鉴过来的特性。

如果你学过java,就能理解这里面的设计模式了。

Iterator it = list.iterator();
while(it.hasNext()){
 //using “it.next();”do some businesss logic
}

PHP版:

<?php

class sample implements Iterator

{

private $_items = array(1,2,3,4,5,6,7);

public function __construct() {}

public function rewind() { reset($this->_items); }

public function current() { return current($this->_items); }

public function key() { return key($this->_items); }

public function next() { return next($this->_items); }

public function valid() { return ( $this->current() !== false ); }

}

$sa = new sample();

foreach($sa as $key => $val){

print $key . "=>" .$val;

}

?>

李龙
李龙
回复 @李龙 : 看来一定要好好看书了
李龙
李龙
学习了
0
c
crackfan
对象也是可以foreach的
返回顶部
顶部