搜索
首页后端开发php教程PHP设计模式之迭代器模式的深入解析_php技巧

迭代器(Iterator)模式,它在一个很常见的过程上提供了一个抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代。迭代有几种不同的具体执行方法:在数组属性,集合对象,数组,甚至一个查询结果集之上迭代。

在对象的世界里,迭代器模式要维持类似数组的功能,看作是一个非侵入性对象刻面(facet),Client类往往分离自真实对象实现,指iterator接口。只要有可能,我们可以给迭代器传送一个引用,代替将来可能发生变化的具体或抽象类。

参与者:
◆客户端(Client):
引用迭代器模式的方法在一组值或对象上执行一个循环。
◆迭代器(Iterator):在迭代过程上的抽象,包括next(),isFinished(),current()等方法。
◆具体迭代器(ConcreteIterators):在一个特定的对象集,如数组,树,组合,集合等上实现迭代。
通过Traversable接口,PHP原生态支持迭代器模式,这个接口由Iterator和IteratorAggregate做了扩展,这两个子接口不仅是定义了一套标准的方法,每个Traversable对象都可以原封不动地传递给foreach(),foreach是迭代器的主要客户端,Iterator实现是真正的迭代器,而IteratorAggregate是有其它职责的Traversable对象,它通过getIterator()方法返回一个Iterator。

标准PHP库是PHP中绑定的唯一通用目的面向对象库,定义了额外的接口和公用类。OuterIterator实现装饰一个Iterator,CachingIterator和LimitIterator是这个接口的两个例子。

RecursiveIterator是Iterator接口为树形结构实现的一个扩展,它定义了一组额外的方法检查迭代中当前元素的子对象是否存在。RecursiveArrayIterator和RecursiveDirectoryIterator是这个接口的实现示例,这些类型的迭代器可以原样使用,或是用一个RecursiveIteratorIterator桥接到一个普通的迭代器契约。这个OuterIterator实现将会根据构造参数执行深度优先或广度优先遍历。

使用RecursiveIteratorIterator时,可以将其传递给foreach,请看后面的代码示例,了解RecursiveIterators的不同用法和它们的超集Iterator。最后,SeekableIterators向契约添加了一个seek()方法,它可以用于移动Iterator的内部状态到一个特定的迭代点。 

注意,迭代器是比对象集更好的抽象,因为我们可以让InfiniteIterators,NoRewindIterators等,不用与普通数组阵列一致,因此,Iterator缺少count()函数等功能。

在PHP官方手册中可以找到完整的SPL迭代器列表。得益于对PHP的强力支持,使用迭代器模式的大部分工作都包括在标准实现中,下面的代码示例就利用了标准Iterator和RecursiveIterators的功能。

复制代码 代码如下:

        /** 
     * Collection that wraps a numeric array. 
     * All five public methods are needed to implement 
     * the Iterator interface. 
     */ 
    class Collection implements Iterator 
    { 
 private $_content; 
 private $_index = 0; 

 public function __construct(array $content) 
 { 
     $this->_content = $content; 
 } 

 public function rewind() 
 { 
     $this->_index = 0; 
 } 

 public function valid() 
 { 
     return isset($this->_content[$this->_index]); 
 } 

 public function current() 
 { 
     return $this->_content[$this->_index]; 
 } 

 public function key() 
 { 
     return $this->_index; 
 } 

 public function next() 
 { 
     $this->_index++; 
 } 
    } 

    $array = array('A', 'B', 'C', 'D'); 
    echo "Collection: "; 
    foreach (new Collection($array) as $key => $value) { 
 echo "$key => $value. "; 
    } 
    echo "\n";
    /** 
     * Usually IteratorAggregate is the interface to implement. 
     * It has only one method, which must return an Iterator 
     * already defined as another class (e.g. ArrayIterator) 
     * Iterator gives a finer control over the algorithm, 
     * because all the hook points of Iterator' contract 
     * are available for implementation. 
     */ 
    class NumbersSet implements IteratorAggregate 
    { 
 private $_content; 

 public function __construct(array $content) 
 { 
     $this->_content = $content; 
 } 

 public function contains($number) 
 { 
     return in_array($number, $this->_content); 
 } 

 /** 
  * Only this method is necessary to implement IteratorAggregate. 
  * @return Iterator 
  */ 
 public function getIterator() 
 { 
     return new ArrayIterator($this->_content); 
 } 
    } 

    echo "NumbersSet: "; 
    foreach (new NumbersSet($array) as $key => $value) { 
 echo "$key => $value. "; 
    } 
    echo "\n";
    // let's play with RecursiveIterator implementations 
    $it = new RecursiveArrayIterator(array( 
 'A', 
 'B', 
 array( 
     'C', 
     'D' 
 ), 
 array( 
     array( 
  'E', 
  'F' 
     ), 
     array( 
  'G', 
  'H', 
  'I' 
     ) 
 ) 
    )); 
    // $it is a RecursiveIterator but also an Iterator, 
    // so it loops normally over the four elements 
    // of the array. 
    echo "Foreach over a RecursiveIterator: "; 
    foreach ($it as $value) { 
 echo $value; 
 // but RecursiveIterators specify additional 
 // methods to explore children nodes 
 $children = $it->hasChildren() ? '{Yes}' : '{No}'; 
 echo $children, ' '; 
    } 
    echo "\n"; 
    // we can bridge it to a different contract via 
    // a RecursiveIteratorIterator, whose cryptic name 
    // should be read as 'an Iterator that spans over 
    // a RecursiveIterator'. 
    echo "Foreach over a RecursiveIteratorIterator: "; 
    foreach (new RecursiveIteratorIterator($it) as $value) { 
 echo $value; 
    } 
    echo "\n";
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
PHP依赖注入容器:快速启动PHP依赖注入容器:快速启动May 13, 2025 am 12:11 AM

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增强codemodocultion,可验证性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

PHP中的依赖注入与服务定位器PHP中的依赖注入与服务定位器May 13, 2025 am 12:10 AM

选择DependencyInjection(DI)用于大型应用,ServiceLocator适合小型项目或原型。1)DI通过构造函数注入依赖,提高代码的测试性和模块化。2)ServiceLocator通过中心注册获取服务,方便但可能导致代码耦合度增加。

PHP性能优化策略。PHP性能优化策略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)启用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替换loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

PHP电子邮件验证:确保正确发送电子邮件PHP电子邮件验证:确保正确发送电子邮件May 13, 2025 am 12:06 AM

phpemailvalidation invoLvesthreesteps:1)格式化进行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)

如何使PHP应用程序更快如何使PHP应用程序更快May 12, 2025 am 12:12 AM

tomakephpapplicationsfaster,关注台词:1)useopcodeCachingLikeLikeLikeLikeLikePachetoStorePreciledScompiledScriptbyTecode.2)MinimimiedAtabaseSqueriSegrieSqueriSegeriSybysequeryCachingandeffeftExting.3)Leveragephp7 leveragephp7 leveragephp7 leveragephpphp7功能forbettercodeefficy.4)

PHP性能优化清单:立即提高速度PHP性能优化清单:立即提高速度May 12, 2025 am 12:07 AM

到ImprovephPapplicationspeed,关注台词:1)启用opcodeCachingwithapCutoredUcescriptexecutiontime.2)实现databasequerycachingusingpdotominiminimizedatabasehits.3)usehttp/2tomultiplexrequlexrequestsandredececonnection.4 limitsclection.4.4

PHP依赖注入:提高代码可检验性PHP依赖注入:提高代码可检验性May 12, 2025 am 12:03 AM

依赖注入(DI)通过显式传递依赖关系,显着提升了PHP代码的可测试性。 1)DI解耦类与具体实现,使测试和维护更灵活。 2)三种类型中,构造函数注入明确表达依赖,保持状态一致。 3)使用DI容器管理复杂依赖,提升代码质量和开发效率。

PHP性能优化:数据库查询优化PHP性能优化:数据库查询优化May 12, 2025 am 12:02 AM

databasequeryOptimizationinphpinvolVolVOLVESEVERSEVERSTRATEMIESOENHANCEPERANCE.1)SELECTONLYNLYNESSERSAYCOLUMNSTORMONTOUMTOUNSOUDSATATATATATATATATATATRANSFER.3)

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境