日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

理解php中的yield

發(fā)布時間:2025/3/13 php 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解php中的yield 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
理解php中的yield <?php function gen() {$ret = (yield 'yield1');var_dump($ret);$ret = (yield 'yield2');var_dump($ret); }$gen = gen(); var_dump($gen->current()); // string(6) "yield1" var_dump($gen->send('ret1')); // string(4) "ret1" (the first var_dump in gen)// string(6) "yield2" (the var_dump of the ->send() return value) var_dump($gen->send('ret2')); // string(4) "ret2" (again from within gen)// NULL (the return value of ->send()) ?>

?


上面的代碼首先是調(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)鍵字,它既是語句,又是表達式,而且這兩種情況是同時存在的:

  • 對于所有在generator函數(shù)中出現(xiàn)的yield,首先它都是語句,而跟在yield后面的任何表達式的值將作為調(diào)用generator函數(shù)的返回值,如果yield后面沒有任何表達式(變量、常量都是表達式),那么它會返回NULL,這一點跟return語句一致。
  • yield也是表達式,它的值就是send函數(shù)傳過來的值(相當(dāng)于一個特殊變量,只不過賦值是通過send函數(shù)進行的)。只要調(diào)用send方法,并且Generator對象的迭代并未終結(jié),那么當(dāng)前位置的yield就會得到send方法傳遞過來的值,這跟generator函數(shù)有沒有把這個值賦值給某個變量沒有任何關(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。