发电机的优点
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。