PHP 使对象可以像数组一样进行foreach循环,要求属性必须是私有
答案
PHP5开始支持了接口, 并且内置了Iterator
接口, 所以如果你定义了一个类,并实现了Iterator
接口,那么你的这个类对象就是ZEND_ITER_OBJECT
,否则就是ZEND_ITER_PLAIN_OBJECT
。
对于ZEND_ITER_PLAIN_OBJECT
的类,foreach
会通过HASH_OF
获取该对象的默认属性数组,然后对该数组进行foreach。而对于ZEND_ITER_OBJECT
的类对象,则会通过调用对象实现的Iterator
接口相关函数来进行foreach
。
class sample implements Iterator
{
private $_items = array(1,2,3,4,5,6,7);
public function __construct() {
;//void
}
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;
}