相关介绍很多,这里看代码
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,这就是创建器的巧妙之处。
解释一下流程:
$num2执行完,执行send语句。
进入fun2,send语句会寻找当前的yield,并执行之,然后在下个yield返回,这里的关键点就是会跳过第一个yield,在第2次yield返回。这就是要点。
所以,从send返回时,$r++已执行过一次,然后在yield返回当前的$r,就是1
所以显示fun1:1
再次执行send时,创建器从上次的断点继续执行,send语句是赋值语句,然后就是2.
一直执行下去。
要点1:
yield即可以返回,又可以被外部的send命令赋值,然后传给等号左边的变量,换句话说,他本身也是表达式,他的值就是外部send的传来值。
要点2:
send语法会找到当前的yield,并在下一个yield返回,或创建器的函数末尾返回。所以看起来第一个yield被跳过。
然而,这都是 同步的代码,所以暂时看不出有什么用途。