這篇文章主要介紹了關於淺談PHP源碼二十四 :iterator實現中當值為false時無法完成迭代的原因分析,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
淺談PHP源碼二十四 :iterator實現中當值為false時無法完成迭代的原因分析
在前面有一篇文章迭代器的簡單實現及Yii架構中的迭代器實現中有一個簡單的迭代器的實現,此處遺留了一個問題,當迭代的值中包含false時,使用foreach迴圈的時候在這個地方就結束了,原因是什麼呢?
順著鳥哥的思路在Zend/zend_vm_execute.h檔案的8131行找到相關的線索,如下所示代碼:
/* */ 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的實現
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!