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 的理解, 記下來並做之後查看, 若有錯誤, 但願大神指出. 謝謝.接口