處理大量資料集時,一次性建立巨大陣列極易耗盡記憶體:
// 直接拋出 Fatal error: Allowed memory size exhausted
range(1, 100000000);
PHP 5.5 引入生成器,配合 yield 關鍵字,實現「惰性求值」:每次僅產生單一元素,函式暫停;下次呼叫 next() 時從上一個 yield 處繼續。整個過程僅在記憶體中保留迴圈變數 $i,極大降低記憶體佔用。
<?php
function xrange($start, $limit, $step = 1) {
for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
}
foreach (xrange(1, 9, 1) as $number) {
echo "$number "; // 輸出:1 2 3 4 5 6 7 8 9
}
file() 一次載入整個檔案。yield 實現分頁迭代,不佔用大量記憶體。return 在生成器中return $value,呼叫端可透過 $gen->getReturn() 取得。yield from 委派生成器yield from $anotherGenerator,簡化巢狀迭代器撰寫。yield $key => $value 可自訂迭代鍵名。生成器 vs 陣列(百萬級資料):
善用生成器,是 PHP 處理大資料、高併發場景的必備技能。