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\n";
}

这样, 结果与官方的会有什么不同? 标红的 $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 的理解, 记下来并作以后查看, 如有错误, 希望大神指出. 谢谢.

posted @ 2016-05-13 18:10  Debm.Zhang  阅读(1154)  评论(0编辑  收藏  举报