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

PHP 5.5 生成器 yield 完整指南:迭代器模式、記憶體優化、無限數據流處理實戰

     編輯:PHP 相關知識

PHP 5.5 生成器 yield 完整指南

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) 預載所有值較長(分配/回收)小數據集
生成器 yieldO(1) 僅保存當前狀態極快(按需計算)大數據集、無限流、檔案逐行讀取

範例:xrange(1, 1000000) 陣列需 ~8MB,生成器僅需固定微小記憶體。

協程機制原理

  • 執行到 yield → 保存上下文(變數、指令指標)→ 交出控制權給調用者
  • 調用者 foreach 迭代 → 恢復上下文 → 繼續執行至下一個 yield
  • 類似 Lua 協程 yield/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) 避免一次性讀入記憶體
  • 資料庫大量據分批導出:分塊查詢 yield 每行
  • 無限序列生成:費波納契、素數序列等
  • 管道流處理:多個生成器串聯過濾/轉換

進階:雙向通信(PHP 7+)

function generator() {
    $received = yield 'first';
    yield 'second: ' . $received;
}

$gen = generator();
echo $gen->current();      // first
$gen->send('from outside');
echo $gen->current();      // second: from outside

掌握生成器,能優雅解決「大數據、低記憶體、高效能」的三角難題。

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