谁做PHP的YIELD-> send()有效?

时间:2013-11-05 05:19:17

标签: php yield

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()跳过一次迭代?

2 个答案:

答案 0 :(得分:1)

yield用于在生成器内发送和接收值。来自Generator RFC如果没有发送任何内容(例如在foreach迭代期间),则返回null

因此,在您的代码中,生成器将恢复两次:

  1. 一次为($y as $val) - yield在生成器
  2. 中返回null
  3. 曾为$y->send('foo') - yield在发电机内返回'foo'
  4. 当我运行你的代码时,我得到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>