首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 生成器實戰:以 yield 打造記憶體高效的迭代器

     編輯:PHP 綜合知識

處理大量資料集時,一次性建立巨大陣列極易耗盡記憶體:

// 直接拋出 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 在生成器中
PHP 7.0+ 允許生成器使用 return $value,呼叫端可透過 $gen->getReturn() 取得。
yield from 委派生成器
PHP 7.0+ 支援 yield from $anotherGenerator,簡化巢狀迭代器撰寫。
鍵值對生成
yield $key => $value 可自訂迭代鍵名。

效能對比

生成器 vs 陣列(百萬級資料):

  • 記憶體:生成器 ~KB 級 vs 陣列 ~百 MB 級
  • 啟動速度:生成器近乎瞬間,陣列需完整建構
  • CPU:生成器略高(函式呼叫開銷),但通常可忽略

善用生成器,是 PHP 處理大資料、高併發場景的必備技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved