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]的代码,所以暂时看不出有什么用途。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章