· 作者:laruence(http://www.laruence.com/)
· 本文地址: http://www.laruence.com/2008/10/31/574.html
· 转载请注明出处
中午的时候,收到一封求教信,是关于这样的一道面试题:
使对象可以像数组一样进行foreach循环,要求属性必须是私有。
刚接触到题的时候,我也没有考虑到Iterator模式,试了几个一般想法,失败以后。。。。就直接去翻看了foreach的源码实现,期望发现foreach处理对象的时候是否有什么特殊性,可以做为突破口。
跟踪了半天以后发现了核心逻辑中的一个奇怪的switch:
从这个结构,我们可以看到,对象分为ZEND_ITER_OBJECT和ZEND_ITER_PLAIN_OBJECT, 这是什么意思呢?
这就要讲到PHP的内置接口Iterator了,PHP5开始支持了接口, 并且内置了Iterator接口, 所以如果你定义了一个类,并实现了Iterator接口,那么你的这个类对象就是ZEND_ITER_OBJECT,否则就是ZEND_ITER_PLAIN_OBJECT.
对于ZEND_ITER_PLAIN_OBJECT的类,foreach会通过HASH_OF获取该对象的默认属性数组,然后对该数组进行foreach.
而对于ZEND_ITER_OBJECT的类对象,则会通过调用对象实现的Iterator接口相关函数来进行foreach, 所以, 对于这道笔试题, 可以作出如下的答案:
以上代码在我的php 5.3下运行正常。
后记: 看手册是很重要的,,,,,, 别人一眼就看出来了,我却绕了这么大的弯子
[ 本帖最后由 laruence 于 2008-11-24 23:15 编辑 ]
培训新闻
- 绝对高端,开沅教育(大连)中心2009年首期P...
- 开沅教育(大连)中心--09年3月北京交通大学...
- .广州多迪php培训,年前最后一期优惠,大家快...
- 上海实战精英班二期开始报名了~~~~~
- 大连开沅教育09年LAMP首期“就业班”开始报名...
- 北京十一期实战精英班,正在热招中,速速报名...
- 北京PCTI-19期,正在热招中,年前报名有优惠...
- 上海PCTI-2期开始开始报名了~~~·
热点专题
网站特别推荐
- 2008.12.24李明老师"互联网时代的就业与...
- 上海实战精英班二期开始报名了~~~~~
- 开沅教育(大连)中心--09年3月北京交通大学...
- 北京十一期实战精英班,正在热招中,速速报名...
- 大连开沅教育09年LAMP首期“就业班”开始报名...
- 北京PCTI-19期,正在热招中,年前报名有优惠...
- 12月24日唐山培训中心特邀PHPChina技术总监 ...
- .广州多迪php培训,年前最后一期优惠,大家快...
- 唐山培训中心这周六有专场讲座,唐山的PHPer...
- 董儿,肥同小可两位版主可以问个问题吗?
社区精华
- linuxroot吐血推荐花了一天时间写的强壮捕获各...
- PHPChina伯乐PHP程序员(1年)
- PHPChina伯乐北京高级的PHP程序员
- PHPChina伯乐浙江 高薪职位!
- PHPChina伯乐网站技术






最新回复
我比较老土,走了弯路, 以后还是要多看手册,呵呵
唉,丢~~~~~~
QUOTE:
呵呵,要看,要看,只是之前没有应用需要用以后就会看了。。
但是,实际运用的时候,有点偏了。
扩展php时出错了...
http://bbs.phpchina.com/thread-87769-1-1.html
QUOTE:
原面试题就是这样的嘛 ... 提示可以用 Iterator 了~~