PHP协同例程/生成器的工作原理

时间:2018-03-15 22:33:41

标签: php generator yield coroutine

我发现了这个PHP协同例程。

https://gnugat.github.io/2014/04/30/php-generators-and-coroutines.html

function holy_grail_countdown($number)
{
    while (0 < $number) {
        $reset = (yield $number);
        $number = $reset ?: $number - 1;
    }
}

$c = holy_grail_countdown(5);
foreach ($c as $number) {
    echo "$number\n"; // outputs 5, then 2 and finally 1.
    if (5 === $number) {
        $c->send(3);
    }
}

我仍然不明白为什么它在工作。为什么它不输出5,3,2,1?

它将值3发送到表达式((yield $number))中,但看起来它执行了2次迭代。

# 1st iteration
$reset = (yield $number); # reset=3
$number = $reset ?: $number - 1; = #number=3
# 2nd iteration
$reset = (yield $number); # reset=null
$number = $reset ?: $number - 1; = #number=3-1=>2

为什么有reset=null的第二次迭代?

谢谢。

0 个答案:

没有答案