迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。

百度百科: http://baike.baidu.com/view/9791023.htm?fr=aladdin

解释

上面这名话可能多数人看得似懂非懂,什么叫做访问容器的各个元素,又不暴露对象的内部细节呢?尤其是网上很多例子都过于简单,直接扔一个数组,然后去实现了迭代器的各种方法,如下:

<?php

class SomeCollection implements Iterator

{

protected $_data;

protected $_pos;

function __construct($data)

{

$this->_data = $data;

$this->_pos = 0;

}

function current()

{

$row = $this->_data[$this->_pos];

return $row;

}

function next()

{

$this->_pos++;

}

function valid()

{

return $this->_pos >= 0 && $this->_pos <count($this->_data);

}

function key()

{

return $this->_pos;

}

function rewind()

{

$this->_pos = 0;

}

}

$array = array(

array('url' => 'www.zeroplace.cn'),

array('url' => 'www.baidu.com'),

array('url' => 'www.sina.com.cn'),

array('url' => 'www.google.com'),

array('url' => 'www.qq.com'),

);

$coll = new SomeCollection($array);

foreach ($coll as $row) {

echo $row['url'], "\n";

}

这样的例子就不能够说明迭代器的作用,因为它不能说明迭代器隐藏了内部的数据结构,传进去的和返回出来的完全是一样的数据。

迭代器怎么用

我只能说在不同的场合有不同的用法。比如我把上面的例子修改一下,可能就可以说明迭代器可以隐藏数据结构这个特性了。请看如下代码。

<?php

class SomeCollection implements Iterator

{

protected $_data;

protected $_pos;

function __construct($data)

{

$this->_data = $data;

$this->_pos = 0;

}

function current()

{

$row = $this->_data[$this->_pos];

$row['ip'] = gethostbyname($row['url']);

return $row;

}

function next()

{

$this->_pos++;

}

function valid()

{

return $this->_pos >= 0 && $this->_pos <count($this->_data);

}

function key()

{

return $this->_pos;

}

function rewind()

{

$this->_pos = 0;

}

}

$array = array(

array('url' => 'www.zeroplace.cn'),

array('url' => 'www.baidu.com'),

array('url' => 'www.sina.com.cn'),

array('url' => 'www.google.com'),

array('url' => 'www.qq.com'),

);

$coll = new SomeCollection($array);

foreach ($coll as $row) {

echo $row['url'], ' ',  $row['ip'], "\n";

}

这样我觉得就可以说明迭代器能隐藏数据结构这个特性了。我们的数据传进去的时候每行数据只有一个url属性,但是迭代出来的时候多了一个ip属性。这样对外部的使用者来说就是有两个属性(url和ip), 它不需要知道这个ip字段是创建者传入的还是在迭代器中产生的。

更一般的做法

这里current方法返回的是一个关联数组,更常规的做法是返回一个对象,此时这个迭代器可能还需要一个对象创建器。

php 迭代器的更多相关文章

  1. 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密

    0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...

  2. 轻量级“集合”迭代器-Generator

    Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ...

  3. C#设计模式-迭代器模式

    一. 迭代器(Iterator)模式 迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作也放在集合对象中,但这样的 ...

  4. 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)

    上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...

  5. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  6. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  7. Java迭代器

    迭代器在其实就是指针,读取集合或者数组中的一个值,读完以后又指向下一条数据. iterator() 迭代器只读,不能改效率要比for循环高 迭代器的一些方法: HasNext() 如果仍有元素可以迭代 ...

  8. Python 生成器与迭代器 yield 案例分析

    前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ...

  9. 设计模式02迭代器(java)

    先贴代码,有空来写内容. 1.定义集合 import java.util.List; import java.util.ArrayList; //coollection是我自己定义的一个集合,因为要写 ...

  10. JAVA编程思想(第四版)学习笔记----11.5 List,11.6迭代器

    Collection类的层次结构图(来源与网络)如下所示: 接口:Iterator<T> public interface Iterable<T> Iterable<T& ...

随机推荐

  1. zepto源码--width,height--学习笔记

    width和height函数,实际上通过css方法也完全可以取到这两个函数的结果.获取width,$elem.css('width');设置width的话,$elem.css('width', 100 ...

  2. Eclipse插件项目 引用其他类库的方法(jar)

    这两天搞了个Eclipse插件项目,用来监测ios.android设备和电脑的连接,安装apk/ipa到对应设备等等功能. 遇到了build path下的library引入编译正常,运行时报Class ...

  3. 50道JavaScript经典题和解法(JS新手进...持续更新...)

    最近在学习<数据结构与算法JavaScript描述>这本书,对JavaScript的特性和数据结构都有了进一步的了解和体会. 学习之余,也进行了相应的练习,题目难度不大,但是对所学知识的巩 ...

  4. Python中*args 和**kwargs的用法

    当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值.还是直接来代码吧,废话少说[python] def fun_var_args(far ...

  5. tag标签调取

    {dede:tag row='10' sort='new' getall='1'}                                <li> <a href='[fie ...

  6. Python-S13作业-day3-之编辑ha.conf配置文件

    Python-S13作业-day3-之编辑ha.conf配置文件 需求: 让用户输入字符串类型的字典,实现对配置文件指定,backend  www.oldboy.org下的内容进行 * 查询 * 增加 ...

  7. 3d sphere opengl

    http://stackoverflow.com/questions/5988686/creating-a-3d-sphere-in-opengl-using-visual-c

  8. 优化系统资源ulimit《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》

    优化系统资源ulimit<高性能Linux服务器构建实战:运维监控.性能调优与集群应用> 假设有这样一种情况,一台Linux 主机上同时登录了10个用户,在没有限制系统资源的情况下,这10 ...

  9. php Memcache

    <?php $mem = new Memcache();//实例化一个对象 $mem->connect("localhost",11211);//连接memcache服 ...

  10. 敏捷BI——岂止于快

    信息爆炸的时代,唯有分析快,才可以把握住可能分分钟流失的数据信息,唯有钻取深,才可以挖掘出海量信息中蕴藏的财富.是时候为您的企业上一套敏捷BI了. [敏捷BI的产生背景] 传统BI由IT人员做报表,业 ...