
最近在学习 PHP yield 相关的知识,遇到了一个搞不懂的问题,直接上代码:
function gen() { for ($i = 0; $i < 3; $i++) { echo "For index:$i\n"; $tmp = (yield$i); } } $gen = gen(); foreach ($gen as $val) { echo "Generator return:$val\n"; } echo "Finish\n"; 上面这段代码会输出:
For index:0 Generator return:0 For index:1 Generator return:1 For index:2 Generator return:2 Finish 但是,只要在代码里加多一句send的代码,如下:
function gen() { for ($i = 0; $i < 3; $i++) { echo "For index:$i\n"; $tmp = (yield $i); } } $gen = gen(); foreach ($gen as $val) { echo "Generator return:$val\n"; $gen->send(++$val); // 这句是新加的代码 } echo "Finish\n"; 然后输出就会变成(相比原输出,少了一行"Generator return:1"):
For index:0 Generator return:0 For index:1 For index:2 Generator return:2 Finish 问题:在这个例子里,为什么加了一句 send 后,输出内容就改变了?
1 coolshuaib 2021 年 6 月 22 日 如果在调用此方法时生成器不在 yield 表达式,**则在发送值之前首先让它前进到下一个 yield 表达式**。因此,没有必要使用 Generator::next() 调用来“准备”PHP 生成器。 `send()` 就迭代了一次。 |
2 rockyliang OP @ykw 好吧,还真是这样,调用 send()后,生成器继续执行,进入到了第二轮循环($i = 1 ),然后 1 作为 send()的返回值返回给了外部,外部没有打印出来,所以输出内容就少了一行。明白了,谢谢你:) |
3 weirdo 2021 年 6 月 22 日 send() ,就直接跑到下一次 yield 了呀 |