PHP 5.5 引入生成器,通過 yield 關鍵字實現惰性求值,極大降低大數據迭代的內存佔用。本文通過對比 range() 與自定義生成器 xrange(),演示生成器如何解決內存耗盡問題。
// 直接創建一億個元素的數組會導致內存耗盡
// Fatal error: Allowed memory size of 134217728 bytes exhausted
range(1, 100000000);
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
}
foreach 請求下一個值時,生成器才會執行到下一個 yield。yield 處凍結,下次恢復繼續執行。// 生成器返回值 (PHP 7+)
function gen() {
yield 1;
yield 2;
return "done";
}
$g = gen();
foreach ($g as $v) { echo $v; }
echo $g->getReturn(); // "done"
// 委托生成器
function inner() { yield 'a'; yield 'b'; }
function outer() { yield from inner(); yield 'c'; }
// 輸出 a b c
生成器是 PHP 處理大數據、流式處理的利器,善用它能讓代碼更優雅、高效。