PHP 5.5 引入生成器,以 yield 關鍵字構建迭代器,類似 Python 生成器。本文詳細講解語法、記憶體優化原理、協程機制、實戰應用場景。
function xrange($start, $end, $step = 1) {
for ($i = $start; $i <= $end; $i += $step) {
yield $i; // 關鍵字:生成單個值並暫停
}
}
foreach (xrange(1, 1000000) as $num) {
echo $num, "\n";
}
關鍵差異:普通函數 return 一次性返回所有值;生成器 yield **按需產生**,每次迭代才執行到下一個 yield。
| 方案 | 記憶體佔用 | 執行時間 | 適用場景 |
|---|---|---|---|
| range() / 陣列 | O(N) 預載所有值 | 較長(分配/回收) | 小數據集 |
| 生成器 yield | O(1) 僅保存當前狀態 | 極快(按需計算) | 大數據集、無限流、檔案逐行讀取 |
範例:xrange(1, 1000000) 陣列需 ~8MB,生成器僅需固定微小記憶體。
yield → 保存上下文(變數、指令指標)→ 交出控制權給調用者foreach 迭代 → 恢復上下文 → 繼續執行至下一個 yieldyield/resume,但 PHP 隱式由 foreach 驅動恢復function xrange($start, $limit, $step = 1) {
for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
}
echo 'Single digit odd numbers: ';
foreach (xrange(1, 9, 2) as $number) {
echo "$number ";
}
// 輸出:1 3 5 7 9
yield fgets($fp) 避免一次性讀入記憶體function generator() {
$received = yield 'first';
yield 'second: ' . $received;
}
$gen = generator();
echo $gen->current(); // first
$gen->send('from outside');
echo $gen->current(); // second: from outside
掌握生成器,能優雅解決「大數據、低記憶體、高效能」的三角難題。