php协程关键词yield学习_PHP_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > PHP > php协程关键词yield学习

php协程关键词yield学习

 2018/1/25 17:16:16  xieye  程序员俱乐部  我要评论(0)
  • 摘要:php5.5新增了yield,实际是一个创建器的语法。相关介绍很多,这里看代码functionfun1($action){while(1){$num2=rand(1000,9999);$stored=$action->send($num2);echo"[fun1:{$stored}]<br>";if($stored==5){break;}}}functionfun2(){$r=0;while(1){$num=(yield$r);echo$num."<br>"
  • 标签:PHP 学习 关键词
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被跳过。

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


发表评论
用户名: 匿名