function yielding()
{
for ($i = 0; $i < 10; $i++) {
var_dump(yield);
}
}
$y = yielding();
foreach ($y as $val) {
$y->send('foo');
}
输出:
string(3) "foo"
NULL
string(3) "foo"
NULL
string(3) "foo"
NULL
string(3) "foo"
NULL
string(3) "foo"
我预计输出为:10次string(3) "foo"
,但输出为一NULL
和一string(3) "foo"
(9次)。为什么?
generate-&gt; send()跳过一次迭代?
答案 0 :(得分:1)
yield
用于在生成器内发送和接收值。来自Generator RFC:如果没有发送任何内容(例如在foreach迭代期间),则返回null 。
因此,在您的代码中,生成器将恢复两次:
($y as $val)
- yield
在生成器$y->send('foo')
- yield
在发电机内返回'foo'当我运行你的代码时,我得到10行输出,以NULL结尾
string(3) "foo"
NULL
...
string(3) "foo"
NULL
答案 1 :(得分:0)
功能send() is used to inject values
如果你想打印foo十次,那么以下可能会有效(未经测试)
function yielding()
{
for ($i = 0; $i < 10; $i++) {
////get a value from the caller
$string = yield;
echo $string;
}
}
编辑:
$y = yielding();
for($k=0;$k<10;$k++)
$y->send('foo');
这将打印十次。
迭代对象时会发生什么:(从手册中引用) “当您遍历该对象时(例如,通过foreach循环),PHP将在每次需要一个值时调用生成器函数,然后在生成器生成一个值时保存生成器的状态,以便它可以当需要下一个值时恢复。
一旦没有更多的值可以产生,那么生成器函数可以简单地退出,并且调用代码继续,就像数组的值已经用完一样。“ < / p>