php yield

php中關於 yield 關鍵字的介紹[點擊查看]php

<?php
function gen_one_to_three() {
    for ($i = 1; $i <= 3; $i++) {
        //注意變量$i的值在不一樣的yield之間是保持傳遞的。
        yield $i;
    }
}

官方上的例子, 能夠理解爲, 調用 yield $i 時, yield 向生成器返回 $i 的值, 官方上的輸出也是容易理解的, 若是稍做修改:html

<?php

function gen_one_to_three() {
    for ($i = 1; $i <= 3; $i++) {
        //注意變量$i的值在不一樣的yield之間是保持傳遞的。
        $val = (yield $i);
        echo $val;
    }
}

$generator = gen_one_to_three();
foreach ($generator as $value) {
    echo "$value\n";
}

這樣, 結果與官方的會有什麼不一樣? 標紅的 $val 會不會有輸出? 帶着這些疑問運行之後, 結果與官方例子的輸出結果是同樣的. 函數

這裏的 yield 會返回一個值給生成器; 固然 $val = (yield $i) 這種寫法, 也是支持的, 只不過 $val 不是 $i, 而是會接收 send 過來的一個值[見這裏]spa

先來看一段代碼:.net

<?php

function gen()
{
    $ret = (yield 'yield1');
    var_dump($ret);
    $ret = (yield 'yield2');
    var_dump($ret);
}

$gen = gen();

// foreach ($gen as $key => $val) {
//     var_dump($val);
// }

var_dump($gen->current());// 輸出內容爲: string(6) "yield1"
var_dump($gen->send('hello first send')); // 這裏會有兩行輸出, 分別爲 string(16) "hello first send"  與 string(6) "yield2"

var_dump($gen->send('hello senond send')); // 這裏一樣會有兩行輸出, 分別爲 string(17) "hello senond send" 與 NULL

代碼引自 在PHP中使用協程實現多任務調度 , 有改動.code

看着輸出的結果, 若是剛接觸 yield, 或是對生成器機制不瞭解, 會不會有些懞圈.協程

對於 current 的輸出, 好理解, 就是返回當前產生的值[看這裏].htm

對於第一個 send, 輸出  hello first send, 也好理解, 上面已經說過, 代碼裏的第一個 $ret 會接收 send 的值, 並 var_dump 出來; 對於輸出的第二行  yield2, 其實就是 $ret = (yield 'yield2'); 這一行返回到生成器中的結果, 由於程序執行中, 遇到了 yield, 會返回一個值給生成器, 而且暫停執行生成器函數. 這裏的 send, 至關於生成器給咱們提供一個接口來  inject (注入).blog

注: 以上只是我的對 yield 的理解, 記下來並做之後查看, 若有錯誤, 但願大神指出. 謝謝.接口

相關文章
相關標籤/搜索