如何能使一个物体像PHP数组foreach循环
半天之后,一个奇怪的开关:在核心逻辑中被发现了。
复制代码代码如下所示:
开关(zend_iterator_unwrap(阵列,ITER tsrmls_cc)){
违约:
案例zend_iter_invalid:
的…
打破
案例zend_iter_plain_object:{
......
打破;
案例zend_iter_plain_array:
的…
打破;
案例zend_iter_object:
......
打破;
}
从这个结构,我们可以看到,对象分为zend_iter_object和zend_iter_plain_object。这个是什么意思
复制代码代码如下所示:
zend_api枚举zend_object_iterator_kind zend_iterator_unwrap(
array_ptr zval *,zend_object_iterator ** ITER tsrmls_dc)
{
开关(z_type_p(array_ptr)){
案例is_object:
如果(z_obj_ht_p(array_ptr)= = iterator_object_handlers){
* ITER =(zend_object_iterator *)zend_object_store_get_object(array_ptr tsrmls_cc);
返回zend_iter_object;
}
如果(hash_of(array_ptr)){
返回zend_iter_plain_object;
}
返回zend_iter_invalid;
案例is_array:
如果(hash_of(array_ptr)){
返回zend_iter_plain_array;
}
返回zend_iter_invalid;
违约:
返回zend_iter_invalid;
}
}
内置的迭代器接口,将相关的PHP,php5开始支持的接口,和一个内置的迭代器接口,所以如果你定义一个类,它实现了Iterator接口,那么你在班上是zend_iter_object,或zend_iter_plain_object。
为zend_iter_plain_object类,每个通过hash_of获取对象的默认属性数组,然后每。阵列
foreach为zend_iter_object,迭代器接口类的对象,通过调用迭代器接口相关的函数对象实施执行。
复制代码代码如下所示:
迭代器遍历延伸{
方法
抽象公共混合流(无效)
抽象公共标量密钥(空)
抽象空下一个(空)
抽象公共空白倒带(空白)
抽象公共有效(无效)
}
因此,对笔试问题可以作如下回答:
复制代码代码如下所示:
类示例实现迭代器
{
私人_items美元=阵列(1,2,3,4,5,6,7);
公共功能__construct(){
}
公共函数rewind(){重置(美元-> _items);}
公共功能的电流(){返回电流(美元-> _items);}
公共功能键(){ return键(美元-> _items);}
公共函数(){ return(下一美元-> _items);}
公共函数(有效)返回($)-当前(){ }!= false);
}
新样本();
foreach(SA美元美元美元关键= val){
打印密钥;
}
上述代码在PHP 5.3下正常运行。