首頁  >  文章  >  後端開發  >  淺談PHP原始碼二十四 :iterator實作中當值為false時無法完成迭代的原因分析

淺談PHP原始碼二十四 :iterator實作中當值為false時無法完成迭代的原因分析

不言
不言原創
2018-06-28 17:57:031315瀏覽

這篇文章主要介紹了關於淺談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的實作

#以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

淺談PHP 原始碼二十三:關於urlencode函數

淺談PHP原始碼二十二:關於array_splice函數

以上是淺談PHP原始碼二十四 :iterator實作中當值為false時無法完成迭代的原因分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn