php5.5新增了yield,实际是一个创建器的语法。
相关介绍很多,这里看代码
class="php" name="code">
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被跳过。
然而,这都是
同步的代码,所以暂时看不出有什么用途。