發電機的優點
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。