php协程关键词yield学习

阅读更多
php5.5新增了yield,实际是一个创建器的语法。

相关介绍很多,这里看代码
    function fun1($action){
        while(1){
            $num2 = rand(1000,9999);
            $stored = $action->send( $num2 ) ;
            echo "[fun1:{$stored} ]
"; if($stored ==5){ break; } } } function fun2(){ $r=0; while(1){ $num=(yield $r); echo $num."
"; $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被跳过。

然而,这都是 同步的代码,所以暂时看不出有什么用途。


你可能感兴趣的:(php,yield,send)