為什麼要使用發電機

當你需要生成大型集合以便稍後迭代時,生成器非常有用。它們是建立實現迭代器的類的一種更簡單的替代方法,這通常是過度的。

例如,考慮以下功能。

function randomNumbers(int $length)
{
    $array = [];
    
    for ($i = 0; $i < $length; $i++) {
        $array[] = mt_rand(1, 10);
    }
    
    return $array;
}

所有這個函式都會生成一個充滿隨機數的陣列。要使用它,我們可能會做 randomNumbers(10),這將給我們一個包含 10 個隨機數的陣列。如果我們想生成一百萬個隨機數怎麼辦? randomNumbers(1000000) 將為我們做到這一點,但代價是記憶。儲存在陣列中的一百萬個整數使用大約 33 兆位元組的記憶體。

$startMemory = memory_get_usage();

$randomNumbers = randomNumbers(1000000);

echo memory_get_usage() - $startMemory, ' bytes';

這是因為一次生成並返回了一百萬個隨機數,而不是一次一個。生成器是解決此問題的簡便方法。