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