发电机的优点

PHP 5.5 引入了 Generators 和 yield 关键字,它允许我们编写看起来更像同步代码的异步代码。

yield 表达式负责将控制权交还给调用代码并在该位置提供恢复点。可以沿 yield 指令发送值。此表达式的返回值是 null 或传递给 Generator::send() 的值。

function reverse_range($i) {
    // the mere presence of the yield keyword in this function makes this a Generator
    do {
        // $i is retained between resumptions
        print yield $i;
    } while (--$i > 0);
}

$gen = reverse_range(5);
print $gen->current();
$gen->send("injected!"); // send also resumes the Generator

foreach ($gen as $val) { // loops over the Generator, resuming it upon each iteration
    echo $val;
}

// Output: 5injected!4321

协程实现可以使用此机制来等待生成器产生的 Awaitable(通过将自身注册为解析回调)并在 Awaitable 解决后立即继续执行 Generator。