發電機的優點

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。