当前位置: 首页 > 后端技术 > PHP

PHP的迭代器和生成器

时间:2023-03-30 04:30:59 PHP

1.迭代器解析:想一想,如果我们把集合对象和对集合对象的操作放在一起,当我们想以不同的方式遍历集合对象中的元素时,我们需要修改集合对象违反了“单一职责原则”,而迭代器模式将数据结构和数据结构的算法分开,两者可以独立开发。优点:支持多种遍历方式。比如对于一个有序列表,我们根据需要提供了正反序遍历的两个迭代器。用户只需要拿到我们的迭代器就可以对集合进行遍历操作,简化聚合类。由于迭代器的引入,原来的集合对象不需要自己遍历集合元素。添加新的聚合类和迭代器类非常方便。两个维度可以独立变化,为不同的集合结构提供统一的接口,从而支持相同的算法对不同的集合结构进行操作缺点:迭代器模式分离了存储数据和遍历数据的职责在添加新的集合对象时,它需要添加相应的迭代器类,类的数量成对增加,一定程度上增加了系统具体接口的复杂度:IteratorextendsTraversable{/*method*/abstractpublicmixedcurrent(void)abstractpublicscalarkey(void)abstractpublicvoidnext(void)abstractpublicvoidrewind(void)abstractpublicboolvalid(void)}简单的foreach迭代器实现position=0;}functionrewind(){var_dump(__METHOD__);$this->position=0;}functioncurrent(){var_dump(__METHOD__);返回$this->array[$this->position];}函数onkey(){var_dump(__METHOD__);返回$this->位置;}functionnext(){var_dump(__METHOD__);++$这个->位置;}functionvalid(){var_dump(__METHOD__);返回isset($this->array[$this->position]);}}$it=newmyIterator;foreach($itas$key=>$value){var_dump($key,$value);回声“\n”;}?>2。GeneratorPHP生成器(generator)是PHP5.5.0引入的功能。与标准的PHP迭代器不同,PHP生成器不需要类实现Iterator接口,从而减轻了类的负担。生成器会根据需要计算并输出需要迭代的值,这对性能影响很大。想象一下,如果标准的PHP迭代器经常在内存中执行迭代操作。数据集的性能必须预先计算;如果要使用特定的方法计算大量数据对性能影响较大。这时候我们就可以使用生成器实时计算并输出后续的值,而不用占用宝贵的内存资源。优点:占用内存少,性能好。每产生一个值,生成器的内部状态就会暂停;当生成器请求下一个值时,内部状态再次恢复。生成器的内部不断在暂停和恢复之间切换,直到循环完成或暂停位置缺点:PHP生成器不能满足所有迭代器,因为如果不查询,生成器永远不知道下一个要迭代的值是什么,没有在构建器中向后或向前移动的方式。生成器也是一次性的,不可能多次迭代同一个生成器,但是,如果需要,可以重建或克隆生成器。创建生成器:因为生成器是PHP函数,所以生成器在函数中使用yield关键字。与普通的PHP函数不同,生产者从不返回值,它们只产生值。