php協程關鍵詞yield學習

php5.5新增了yield,實際是一個創建器的語法。

相關介紹很多,這裏看代碼

function fun1($action){
while(1){
$num2 = rand(1000,9999);
$stored = $action->send( $num2 ) ;
echo "[fun1:{$stored} ]<br>";
if($stored ==5){
break;
}
}
}

function fun2(){
$r=0;
while(1){
$num=(yield $r);
echo $num."<br>";
$r++;
}
}

$gen = fun2();
$fun1($gen);



結果展示

6593
[fun1:1 ]
1600
[fun1:2 ]
7428
[fun1:3 ]
6764
[fun1:4 ]
3670
[fun1:5 ]


fun2()得到一個創建器對象。
創建器對象可以象數組一樣迭代取值,但這裏使用了send語法。
send語法可以在兩個函數之間互相傳參,這裏fun1把隨機數傳給fun2顯示,fun2把次數返回給fun1,這就是創建器的巧妙之處。

解釋一下流程:
[size=large]$num2執行完,執行send語句。
進入fun2,send語句會尋找當前的yield,並執行之,然後在下個yield返回,這裏的關鍵點就是會跳過第一個yield,在第2次yield返回。這就是要點。
所以,從send返回時,$r++已執行過一次,然後在yield返回當前的$r,就是1
所以顯示fun1:1
再次執行send時,創建器從上次的斷點繼續執行,send語句是賦值語句,然後就是2.
一直執行下去。[/size]

要點1:
[b][size=large]yield即可以返回,又可以被外部的send命令賦值,然後傳給等號左邊的變量,換句話說,他本身也是表達式,他的值就是外部send的傳來值。[/size][/b]
要點2:
[size=large][b]send語法會找到當前的yield,並在下一個yield返回,或創建器的函數末尾返回。所以看起來第一個yield被跳過。[/b][/size]

然而,這都是[size=x-large]同步[/size]的代碼,所以暫時看不出有什麼用途。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章