您的位置:首页 > PHP > PHP源码阅读笔记二十四 :iterator实现中当值为false时无法完成迭代的原因分析

PHP源码阅读笔记二十四 :iterator实现中当值为false时无法完成迭代的原因分析

PHP源码阅读笔记二十四 :iterator实现中当值为false时无法完成迭代的原因分析
在前面有一篇文章迭代器的简单实现及Yii框架中的迭代器实现中有一个简单的迭代器的实现,此处遗留了一个问题,当迭代的值中包含false时,使用foreach循环的时候在这个地方就结束了,原因是什么呢?

在鸟哥的blog中,很久以前一篇文章对iterator的实现作了一些说明:http://www.laruence.com/2008/10/31/574.html
但是并没有对false的值的处理作相关说明
顺着鸟哥的思路在Zend/zend_vm_execute.h文件的8131行找到相关的线索,如下所示代码:

1
2
3
4
5
6
7
8
9
10
/*  */
if (!iter || (iter->index > 0 && iter->funcs->valid(iter TSRMLS_CC) == FAILURE)) {
/* reached end of iteration */
if (EG(exception)) {
array->refcount--;
zval_ptr_dtor(&array);
ZEND_VM_NEXT_OPCODE();
}
ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
}

对于实现的简单的迭代器,iter->funcs->valid(iter TSRMLS_CC) 方法调用的valid()方法,
如果我们的值为false时,通过current返回的值为false,此时通过foreach访问时,遍历就在此中断了,程序会继续执行下面的代码,而不是这个循环了

解决方案
将数组中的key和value分开处理
在valid(),rewind(),next()方法中操作key,而不是value
仅在current中返回value
如文章迭代器的简单实现及Yii框架中的迭代器实现中的Yii框架中的CMapIterator的实现

本文地址:PHP源码阅读笔记二十四 :iterator实现中当值为false时无法完成迭代的原因分析    文章出处:PHP源码阅读,PHP设计模式,PHP学习笔记,项目管理-胖胖的空间

转载请以链接形式注明原始出处和作者,谢绝不尊重版权者抄袭!

5 条留言我要留言

  •   1 - 刘宇峰  |  2010-04-28 at 10:30 am  

    你好.我做PHP现在有一年半的时间了.时间比较短.现在在研究PHP扩展方便的知识.看了你的BOLG学到了不少知识.还有很多没有来得及看.
    希望多跟你请教下
    我的联系方式:
    qq:61183
    MSN:cho.do@live.cn

  •   2 - alee  |  2011-04-28 at 4:30 pm  

    key 可以是 false ,
    例如:
    array(1,2,false=>3,4,5) ;

  •   3 - 胖胖  |  2011-04-28 at 4:36 pm  

    当值为false,有木有!有木有!!

Trackbacks

  1. YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因 | 胖子的空间
  2. 思考PHP语言一:控制结构 | PHP源码阅读,PHP设计模式,PHP学习笔记-胖子的空间

必填

必填,绝不公开

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word