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

來源:互聯網
上載者:User
這篇文章主要介紹了關於淺談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!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.