理解php中的yield
?
上面的代碼首先是調(diào)用函數(shù)gen生成一個Generator對象,然后調(diào)用這個對象的current方法返回第一個值,顯然它是第一個yield語句的返回值,也就是'yield1',這個時候gen函數(shù)的執(zhí)行就會被中止,接著執(zhí)行var_dump($g->send('ret1'));。
調(diào)用$g->send('ret1'),傳入?yún)?shù)為字符串'ret1',按照上面的說明,它會賦值給第一個yield表達式,也就是(yield 'yield1')中的yield(注意:這個時候不包括'yield1'),它的值為'ret1',然后會賦值給$ret,所以第二個輸出'ret1'就是gen函數(shù)中的第一個var_dump輸出的。此時對Generator對象的迭代會恢復(fù)繼續(xù)執(zhí)行,實際上就是調(diào)用了一次next函數(shù),它會執(zhí)行到下一個yield語句:yield 'yield2',這個語句會返回'yield2',它會作為$g->send('ret1')的返回值,所以函數(shù)外第二個var_dump會輸出'yield2'。
最后再次調(diào)用send函數(shù),這次傳入的參數(shù)為字符串'ret2',跟上面一樣,Generator對象當(dāng)前位置的元素是在gen函數(shù)的第二個yield上,所以’ret2'會被傳遞給第二個yield表達式,也就是作為(yield 'yield2')中的yield的值,并且會被賦值給$ret變量,然后gen函數(shù)恢復(fù)執(zhí)行,它會執(zhí)行g(shù)en函數(shù)中的最后一個var_dump,此時對Generator對象$g的遍歷也結(jié)束了,第二個send函數(shù)的返回值為NULL,這也是函數(shù)外的最后一個var_dump的輸出。
讀了這么一段分析以后,你現(xiàn)在最大的困惑是什么呢?
我最大的困惑是為什么同一個yied關(guān)鍵字,它既是語句,又是表達式,而且這兩種情況是同時存在的:
從上面兩點我們就可以看出,任何時候yield關(guān)鍵詞都即是語句——可以為generator函數(shù)返回值,也是表達式——可以接收Generator對象發(fā)過來的值。
-------------------------分界線:上面是摘抄的,下面是自己的疑問---------------------------講的很好。但有點疑問就是:
在執(zhí)行完gen中的var_dump之后,generator應(yīng)該終止啊。但是,為什么卻又恢復(fù)了,繼續(xù)執(zhí)行下一條yield語句呢。 我猜是因為當(dāng)yield作為表達式的時候,generator并沒有進行迭代。只有yield被當(dāng)做了語句執(zhí)行之后,generator才會終止吧。
------------再次補充:關(guān)于yield既是表達式又是語句的理解--------
<?phpfunction gen() {for($i=1;$i<=100;$i++) {$cmd = (yield $i);if($cmd=='stop') {return;}}}$gen = gen();$i=0;foreach($gen as $item) {echo $item."\n";if($i>=10) {$gen->send('stop');}$i++;} ?>?
這是個很好地例子:1、yield作為語句(類似return語句),會返回$i給調(diào)用者。
2、yield作為表達式。獲取send函數(shù)傳遞值,賦值給$cmd。
3、實現(xiàn)Generator對象和generator函數(shù)的通信。這個很重要。應(yīng)該能實現(xiàn)很多generator的交互. posted on 2016-06-30 11:54 禪茶自在 閱讀(...) 評論(...) 編輯 收藏
轉(zhuǎn)載于:https://www.cnblogs.com/phptea/p/5629510.html
總結(jié)
以上是生活随笔為你收集整理的理解php中的yield的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: unbuntu server (linu
- 下一篇: 动态规划算法php,php算法学习之动态