# PHP中的迭代器模式是什么
## 目錄
1. [迭代器模式概述](#迭代器模式概述)
2. [為什么需要迭代器模式](#為什么需要迭代器模式)
3. [PHP中的迭代器接口](#php中的迭代器接口)
4. [內置迭代器實現示例](#內置迭代器實現示例)
5. [自定義迭代器實現](#自定義迭代器實現)
6. [迭代器模式的高級應用](#迭代器模式的高級應用)
7. [與其他設計模式的比較](#與其他設計模式的比較)
8. [性能考量](#性能考量)
9. [實際項目案例](#實際項目案例)
10. [總結](#總結)
## 迭代器模式概述
迭代器模式(Iterator Pattern)是行為型設計模式之一,它提供了一種順序訪問聚合對象中各個元素的方法,而又不暴露該對象的內部表示。
### 基本概念
- **迭代器(Iterator)**:負責定義訪問和遍歷元素的接口
- **具體迭代器(Concrete Iterator)**:實現迭代器接口,并記錄遍歷的當前位置
- **聚合(Aggregate)**:負責定義創建相應迭代器對象的接口
- **具體聚合(Concrete Aggregate)**:實現創建相應迭代器的接口
```php
// 簡單示例
interface Iterator {
public function rewind();
public function current();
public function key();
public function next();
public function valid();
}
// 傳統數組遍歷
$array = [1, 2, 3];
for ($i = 0; $i < count($array); $i++) {
echo $array[$i];
}
// 當數據結構變化時需要修改所有遍歷代碼
PHP內置了完整的迭代器體系,主要通過以下接口實現:
Iterator
interface Iterator extends Traversable {
public function current(): mixed;
public function next(): void;
public function key(): mixed;
public function valid(): bool;
public function rewind(): void;
}
IteratorAggregate
interface IteratorAggregate extends Traversable {
public function getIterator(): Traversable;
}
其他擴展接口
PHP標準庫(SPL)提供了多種現成的迭代器: - ArrayIterator - DirectoryIterator - RecursiveArrayIterator - FilterIterator - LimitIterator - 等等…
$array = ['a' => 1, 'b' => 2, 'c' => 3];
$iterator = new ArrayIterator($array);
foreach ($iterator as $key => $value) {
echo "$key => $value\n";
}
$dir = new DirectoryIterator(__DIR__);
foreach ($dir as $fileinfo) {
if (!$fileinfo->isDot()) {
echo $fileinfo->getFilename() . "\n";
}
}
$array = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$iterator = new ArrayIterator($array);
$filtered = new CallbackFilterIterator($iterator, function($current) {
return $current % 2 == 0;
});
foreach ($filtered as $number) {
echo $number . "\n"; // 輸出偶數
}
class MyIterator implements Iterator {
private $position = 0;
private $array = [
"first",
"second",
"third"
];
public function rewind() {
$this->position = 0;
}
public function current() {
return $this->array[$this->position];
}
public function key() {
return $this->position;
}
public function next() {
++$this->position;
}
public function valid() {
return isset($this->array[$this->position]);
}
}
class MyCollection implements IteratorAggregate {
private $items = [];
public function addItem($item) {
$this->items[] = $item;
}
public function getIterator() {
return new ArrayIterator($this->items);
}
}
class DbResultIterator implements Iterator {
private $result;
private $current;
private $key = 0;
public function __construct(mysqli_result $result) {
$this->result = $result;
}
public function rewind() {
$this->key = 0;
$this->result->data_seek(0);
$this->current = $this->result->fetch_assoc();
}
public function current() {
return $this->current;
}
public function key() {
return $this->key;
}
public function next() {
$this->current = $this->result->fetch_assoc();
$this->key++;
}
public function valid() {
return $this->current !== null;
}
}
class LazyLoaderIterator implements Iterator {
private $loader;
private $loadedData = null;
private $position = 0;
public function __construct(callable $loader) {
$this->loader = $loader;
}
private function loadData() {
if ($this->loadedData === null) {
$this->loadedData = call_user_func($this->loader);
}
return $this->loadedData;
}
// 實現Iterator接口方法...
}
class InfiniteSequence implements Iterator {
private $start;
private $step;
private $current;
private $key = 0;
public function __construct($start = 0, $step = 1) {
$this->start = $start;
$this->step = $step;
}
public function current() {
return $this->current;
}
public function next() {
$this->current += $this->step;
$this->key++;
}
public function key() {
return $this->key;
}
public function valid() {
return true; // 永遠有效
}
public function rewind() {
$this->current = $this->start;
$this->key = 0;
}
}
class CompositeIterator implements Iterator {
private $iterators = [];
private $currentIterator;
private $position = 0;
public function addIterator(Iterator $iterator) {
$this->iterators[] = $iterator;
}
// 實現Iterator接口方法...
}
// 組合模式中的迭代器實現
class Composite implements IteratorAggregate {
private $children = [];
public function getIterator() {
return new RecursiveArrayIterator($this->children);
}
}
// 生成器示例
function xrange($start, $end, $step = 1) {
for ($i = $start; $i <= $end; $i += $step) {
yield $i;
}
}
// Laravel Collection實現了IteratorAggregate
$collection = collect([1, 2, 3]);
foreach ($collection as $item) {
// ...
}
$finder = new Symfony\Component\Finder\Finder();
$finder->files()->in(__DIR__);
foreach ($finder as $file) {
// 處理文件
}
$query = $entityManager->createQuery('SELECT u FROM User u');
$users = $query->iterate();
foreach ($users as $row) {
// 處理每行數據
}
迭代器模式在PHP中有著廣泛的應用,從簡單的數組遍歷到復雜的ORM結果集處理,它提供了一種統一的遍歷各種數據結構的方式。PHP通過內置的迭代器接口和豐富的SPL迭代器類,使得實現和使用迭代器變得非常方便。
隨著PHP的發展,生成器(yield)和生成器委托等特性進一步擴展了迭代的能力,但迭代器模式仍然是處理集合遍歷的基礎模式。
本文共計約5300字,詳細介紹了PHP中迭代器模式的概念、實現和應用。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。