zoukankan      html  css  js  c++  java
  • php yield

    php中关于 yield 关键字的介绍[点击查看]

    <?php
    function gen_one_to_three() {
        for ($i = 1; $i <= 3; $i++) {
            //注意变量$i的值在不同的yield之间是保持传递的。
            yield $i;
        }
    }

    官方上的例子, 可以理解为, 调用 yield $i 时, yield 向生成器返回 $i 的值, 官方上的输出也是容易理解的, 如果稍作修改:

    <?php
    
    function gen_one_to_three() {
        for ($i = 1; $i <= 3; $i++) {
            //注意变量$i的值在不同的yield之间是保持传递的。
            $val = (yield $i);
            echo $val;
        }
    }
    
    $generator = gen_one_to_three();
    foreach ($generator as $value) {
        echo "$value
    ";
    }

    这样, 结果与官方的会有什么不同? 标红的 $val 会不会有输出? 带着这些疑问运行以后, 结果与官方例子的输出结果是一样的. 

    这里的 yield 会返回一个值给生成器; 当然 $val = (yield $i) 这种写法, 也是支持的, 只不过 $val 不是 $i, 而是会接收 send 过来的一个值[见这里]

    先来看一段代码:

    <?php
    
    function gen()
    {
        $ret = (yield 'yield1');
        var_dump($ret);
        $ret = (yield 'yield2');
        var_dump($ret);
    }
    
    $gen = gen();
    
    // foreach ($gen as $key => $val) {
    //     var_dump($val);
    // }
    
    var_dump($gen->current());// 输出内容为: string(6) "yield1"
    var_dump($gen->send('hello first send')); // 这里会有两行输出, 分别为 string(16) "hello first send"  与 string(6) "yield2"
    
    var_dump($gen->send('hello senond send')); // 这里同样会有两行输出, 分别为 string(17) "hello senond send" 与 NULL

    代码引自 在PHP中使用协程实现多任务调度 , 有改动.

    看着输出的结果, 如果刚接触 yield, 或是对生成器机制不了解, 会不会有些懞圈.

    对于 current 的输出, 好理解, 就是返回当前产生的值[看这里].

    对于第一个 send, 输出  hello first send, 也好理解, 上面已经说过, 代码里的第一个 $ret 会接收 send 的值, 并 var_dump 出来; 对于输出的第二行  yield2, 其实就是 $ret = (yield 'yield2'); 这一行返回到生成器中的结果, 因为程序执行中, 遇到了 yield, 会返回一个值给生成器, 并且暂停执行生成器函数. 这里的 send, 相当于生成器给我们提供一个接口来  inject (注入).

    注: 以上只是个人对 yield 的理解, 记下来并作以后查看, 如有错误, 希望大神指出. 谢谢.

  • 相关阅读:
    SSH框架——(二)四层结构:DAO,Service,Controller,View层
    Spring知识概括梳理
    设计模式——(一)工厂模式2
    设计模式——(一)工厂模式1
    Spring——(一)IoC
    Toad 实现 SQL 优化
    string 和String的区别
    StructureMap依赖注入
    Oracle/PLSQL: BitAnd Function
    log.debug(e.getMessage());
  • 原文地址:https://www.cnblogs.com/debmzhang/p/5490329.html
Copyright © 2011-2022 走看看