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

PHP 設計模式實戰:迭代器模式實現與 SPL 標準庫應用

     編輯:PHP 綜合知識

模式定義

**迭代器模式**:在不暴露聚合對象內部結構的前提下,順序訪問其元素。核心角色:

  • Iterator (迭代器接口):定義遍歷操作 current(), key(), next(), rewind(), valid()
  • ConcreteIterator (具體迭代器):實現具體遍歷邏輯,維護位置狀態
  • Aggregate (聚合接口):定義 getIterator()
  • ConcreteAggregate (具體聚合):返回具體迭代器實例

手動實現示例

class ConcreteIterator implements Iterator {
    private $position = 0;
    private $arr;
    
    public function __construct(array $arr) {
        $this->arr = $arr;
    }
    
    public function rewind() { $this->position = 0; }
    public function current() { return $this->arr[$this->position]; }
    public function key() { return $this->position; }
    public function next() { ++$this->position; }
    public function valid() { return isset($this->arr[$this->position]); }
}

// 使用
$arr = ['xiao hong', 'xiao ming', 'xiaohua'];
$iterator = new ConcreteIterator($arr);

foreach ($iterator as $key => $value) {
    echo "$key=>$value\n";
}
// 輸出:
// 0=>xiao hong
// 1=>xiao ming
// 2=>xiaohua

SPL 標準庫:內建迭代器體系

PHP 5+ 提供豐富的 SPL (Standard PHP Library) 迭代器,**優先使用內建類**而非手寫:

實戰組合示例

遞歸遍歷目錄並過濾 PHP 文件

$dir = new RecursiveDirectoryIterator('/path/to/project');
$iterator = new RecursiveIteratorIterator($dir);
$phpFiles = new RegexIterator($iterator, '/\.php$/i');

foreach ($phpFiles as $file) {
    echo $file->getPathname() . " ({$file->getSize()} bytes)\n";
}

分頁遍歷大數據集

$data = range(1, 10000); // 模擬大數據
$page = 3; $perPage = 10;
$iterator = new LimitIterator(new ArrayIterator($data), ($page-1)*$perPage, $perPage);

foreach ($iterator as $item) {
    echo "$item ";
}
// 輸出: 21 22 23 24 25 26 27 28 29 30

自定義過濾:僅輸出偶數

$numbers = new ArrayIterator(range(1, 20));
$evens = new CallbackFilterIterator($numbers, fn($v) => $v % 2 === 0);

foreach ($evens as $v) echo "$v "; // 2 4 6 8 10 12 14 16 18 20

生成器 vs 迭代器

迭代器類用途關鍵方法
ArrayIterator數組遍歷seek(), offsetGet(), offsetSet()
ArrayObject數組對象化,支援迭代、計數、序列化getIterator(), count(), serialize()
DirectoryIterator目錄遍歷getFilename(), isFile(), isDir(), getSize()
FilesystemIterator文件系統遍歷 (更強大)CURRENT_AS_FILEINFO, KEY_AS_PATHNAME
RecursiveDirectoryIterator遞歸目錄遍歷getChildren(), hasChildren()
RecursiveIteratorIterator遞歸迭代器外層包裝setMaxDepth(), CATCH_GET_CHILD
FilterIterator過濾元素 (抽象類)accept() 必須實現
CallbackFilterIterator回調過濾構造函數傳入 callable
RegexIterator正則過濾構造函數傳入 pattern
LimitIterator限制範圍 (分頁)offset, count
CachingIterator緩存迭代,支援 lookaheadhasNext(), getCache()
IteratorIterator將 Traversable 包裝為 Iterator內部委派

生成器實現迭代器接口 (PHP 7+)

function createIterator(array $data): Iterator {
    foreach ($data as $key => $value) {
        yield $key => $value;
    }
}

// 返回 Generator 實例,實現了 Iterator 接口
$it = createIterator(['a', 'b', 'c']);
$it->rewind();
while ($it->valid()) {
    echo $it->key() . '=>' . $it->current() . "\n";
    $it->next();
}

最佳實踐總結

  1. 優先使用 SPL 內建迭代器:功能豐富、經過優化、標準化
  2. 簡單遍歷用生成器:代碼簡潔、內存友好、惰性計算
  3. 需隨機訪問/重複迭代用 ArrayObject:支援下標訪問、計數、序列化
  4. 複雜過濾組合用 FilterIterator 族:鏈式組合、聲明式邏輯
  5. 實現 Aggregate 接口:讓領域對象直接支援 foreach

總結

迭代器模式在 PHP 中通過 SPL 標準庫得到了極致實現。理解 Iterator、Traversable、IteratorAggregate 接口體系,善用 ArrayIterator、DirectoryIterator、FilterIterator 等組合,能編寫出優雅、高效、可復用的遍歷邏輯。現代 PHP 開發中,生成器與迭代器互補,根據場景選擇最適工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性Generator (yield)Iterator (SPL/手寫)
語法複雜度低 (函數內 yield)高 (實現 5 個方法)
狀態管理自動保持局部變量手動維護 $position 等
可重複迭代否 (一次性)是 (rewind() 重置)
隨機訪問不支援支援 (seek(), ArrayObject)
內存效率極高 (惰性生成)視實現而定