最近在学习 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 后,输出内容就改变了?