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 的理解, 记下来并作以后查看, 如有错误, 希望大神指出. 谢谢.