# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。