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

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

解释

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

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 _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";

}

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

迭代器怎么用

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

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 _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 mysql迭代器_php 迭代器相关推荐

  1. 华为云数据库内核专家为您揭秘MySQL Volcano模型迭代器性能提升千倍的秘密

    林舒,20年以上数据库内核研发经验.原IBMDB2数据库内核专家,专长数据库内核性能优化.SQL查询优化.MPP分布式数据仓库技术等.现就职于华为加拿大研究所,全程参与了RDS for MySQL以及 ...

  2. mysql迭代器_迭代器 - 刘海子 - 博客园

    一,三层装饰器 import time def outter1(func): def wrapper(*args, **kwargs): start = time.time() res = func( ...

  3. python3生成器与迭代器_python3迭代器和生成器 | 吴老二

    迭代函数就是一个利用for...in来完成的一个过程,但是呢?在没说迭代函数之前我们需要了解一下什么是迭代器,什么是生成器,两者的区别是什么,先一个一个的学习. 迭代器 先学习一下什么是迭代器,迭代器 ...

  4. C++中的迭代器(STL迭代器)iterator

    1.Cpp中的迭代器 要访问顺序容器和关联容器中的元素,需要通过迭代器(iterator)进行.迭代器是一个变量,相当于容器和操纵容器的算法之间的中介.迭代器可以指向容器中的某个元素,通过迭代器就可以 ...

  5. php 管理 mysql 数据库 代码_安装并使用phpMyAdmin管理MySQL数据库_php

    学会使用基于web数据库的管理工具phpMyAdmin. 如果使用合适的工具,mysql数据库的管理就会为得相当简单.应用MySQL命令行方式需要对MySQL知识非常熟悉,对SQL语言也是同样的道理. ...

  6. es6 迭代器_揭秘ES6迭代器和迭代器

    es6 迭代器 by Tiago Lopes Ferreira 由Tiago Lopes Ferreira 揭秘ES6迭代器和迭代器 (Demystifying ES6 Iterables & ...

  7. php用到的mysql语句_PHP中常用到的一些MySQL语句_php

    在php开发中,经常会使用到mysql语句,下面就为您列举了一些经常使用的MySQL语句,希望对您平时的学习和开发工作能起到些许的作用. MySQL语句显示数据库或表: show databases; ...

  8. php备份mysql页面_如何用PHP的页面备份、恢复Mysql数据库_php

    //备份数据 $i   =   0; $crlf="/r/n"; $dbname="xgtqr"; global     $dbconn; http://www ...

  9. python列表迭代器_python迭代器生成器-迭代器和list区别

    迭代 生成 for循环遍历的原理 for循环遍历的原理就是迭代,in后面必须是可迭代对象 为什么要有迭代器 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集 ...

最新文章

  1. linux系统编码修改
  2. JSR315(JavaTM Servlet 3.0 Specification)
  3. 2015年企业如何避免索尼式的安全悲剧?
  4. memcached+magent实现memcached集群
  5. JavaScript学习笔记02【基础——对象(Function、Array、Date、Math)】
  6. springboot + redis
  7. Elasticsearch 入门到高手的成长阶梯-索引的基本操作(1)
  8. 数据仓库和数据库有什么区别
  9. 中国高新技术企业名单数据
  10. vue.js可视化开发工具_Vue.js开发工具
  11. 人工智能与大数据就业前景_人工智能就业方向及发展前景
  12. 叶檀:别上了美国人的当 加息会给中国致命一击
  13. ABAP -- 删除重复项
  14. 学习大数据的第13天——Java面向对象(接口、分析参数返回值的类型不同时如何解决、包以及访问权限修饰符(public、protected、默认、private))
  15. 达梦工具数据迁移 违反唯一约束
  16. 2021-03-26:给定一个正整数N,表示有N份青草统一堆放在仓库里。有一只牛和一只羊,牛先吃,羊后吃,它俩轮流吃草。 不管是牛还是羊,每一轮能吃的草量必须是:1,4,16,64…(4的某次方)。谁
  17. 升级macos beta_Big Sur Beta:开发人员意见以及为何对macOS的未来感到担忧
  18. create和qypt qt_Win10安装PyQt5与Qt Designer
  19. 蜜拓蜜 实体微商缔造者
  20. 文本溢出显示省略号,鼠标浮动查看全部内容

热门文章

  1. Thinkphp5.0快速入门笔记(3)
  2. ASP.NET Web API中展示实体Link相关的方面
  3. 记一次LVM修复过程
  4. 2018~2019-11 20165107 网络对抗技术期末免考 Exp10 Final Powershell学习应用与渗透实践...
  5. Redis list(列表)
  6. BZOJ3879: SvT【后缀数组+单调栈】
  7. 主键primary key和唯一索引unique index
  8. 在嵌入式Jetty(Embedded Jetty)中部署FastCGI Servlet载入PHP程序
  9. TortoiseGit for windows安装与配置
  10. PowerDesigner的数据类型