**迭代器模式**:在不暴露聚合對象內部結構的前提下,順序訪問其元素。核心角色:
current(), key(), next(), rewind(), valid()getIterator()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
PHP 5+ 提供豐富的 SPL (Standard PHP Library) 迭代器,**優先使用內建類**而非手寫:
| 迭代器類 | 用途 | 關鍵方法 |
|---|---|---|
| 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 | 緩存迭代,支援 lookahead | hasNext(), getCache() |
| IteratorIterator | 將 Traversable 包裝為 Iterator | 內部委派 |
| 特性 | Generator (yield) | Iterator (SPL/手寫) |
|---|---|---|
| 語法複雜度 | 低 (函數內 yield) | 高 (實現 5 個方法) |
| 狀態管理 | 自動保持局部變量 | 手動維護 $position 等 |
| 可重複迭代 | 否 (一次性) | 是 (rewind() 重置) |
| 隨機訪問 | 不支援 | 支援 (seek(), ArrayObject) |
| 內存效率 | 極高 (惰性生成) | 視實現而定 |