PHP设计模式之PHP迭代器模式讲解


Posted in PHP onMarch 22, 2019

迭代器有时又称光标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如list或vector)上遍访的接口,设计人员无需关心容器物件的内容。

各种语言实作Iterator的方式皆不尽同,有些面向对象语言像Java, C#, Python, Delphi都已将Iterator的特性内建语言当中,完美的跟语言整合,我们称之隐式迭代器(implicit iterator),但像是C++语言本身就没有Iterator的特色,但STL仍利用template实作了功能强大的iterator。

PHP5开始支持了接口, 并且内置了Iterator接口, 所以如果你定义了一个类,并实现了Iterator接口,那么你的这个类对象就是ZEND_ITER_OBJECT,否则就是ZEND_ITER_PLAIN_OBJECT.

对于ZEND_ITER_PLAIN_OBJECT的类,foreach会通过HASH_OF获取该对象的默认属性数组,然后对该数组进行foreach.

先来看下迭代器的定义,那就是提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部显示。它可帮助构造特定的对象,那些对象能够提供单一标准接口循环或迭代任何类型的可计数数据。来看下迭代器模式的结构图:

PHP设计模式之PHP迭代器模式讲解

再来看下迭代器需要用到的内部方法:

  • Iterator::current — Return the current element 返回当前元素
  • Iterator::key — Return the key of the current element 返回当前元素的键
  • Iterator::next — Move forward to next element 移向下一个元素
  • Iterator::rewind — Rewind the Iterator to the first element 重新回到第一个元素
  • Iterator::valid — Checks if current position is valid 检查当前位置的有效性

而对于ZEND_ITER_OBJECT的类对象,则会通过调用对象实现的Iterator接口相关函数来进行foreach。

<?php
/**
* Iterator模式的简单实现类
*/
class sample implements Iterator {
  private $_items ;
  public function __construct(&$data) {
    $this->_items = $data;
  }
  public function current() {
    return current($this->_items);
  }
  public function next() {
    next($this->_items);  
  }
  public function key() {
    return key($this->_items);
  }
  public function rewind() {
    reset($this->_items);
  }
  public function valid() {                                       
    return ($this->current() !== FALSE);
  }
}
/** DEMO */
$data = array(1, 2, 3, 4, 5);
$sa = new sample($data);
foreach ($sa AS $key => $row) {
  echo $key, ' ', $row, '<br />';
}
?>

举几个迭代器的使用范围:

使用返回迭代器的包或库时(如PHP5中的SPL迭代器)
无法在一次的调用获取容器的所有元素时
要处理数量巨大的无素时(数据库中的表以GB计的数据)
……

不同的迭代器有不同的接口,例如PHP SPL迭代器中包括Next()(移动到下一个元素),corrent()(返回当前元素),valid()(检查迭代结尾),rewind()(从头重新开始),key()(返回当前元素的索引)。当然你可以自己写适合自己用的迭代器,也可以用系统中的迭代器。

一般是使用foreach来使用迭代器,下面整理了一下代码:

<?php  
class sample implements Iterator
{
  private $_items = array(1,2,3,4,5,6,7);
  public function __construct() {
         ;//void
  }
  public function rewind() { reset($this->_items); }
  public function current() { return current($this->_items); }
  public function key() { return key($this->_items); }
  public function next() { return next($this->_items); }
  public function valid() { return ( $this->current() !== false ); }
}
$sa = new sample();
foreach($sa as $key => $val){
  print $key . "=>" .$val;
}
?>

while循环也可以:

<?php
while ($itertor->valid()){ //判断是不是最后元素
 $element=$itertor->current(); //获取当前元素
 $itertor->next(); //移动到下一个元素
}
?>

为什么要学习PHP的迭代器呢?有个很重要的原因:利用PHP的迭代器可以利用面向对象实现常见的数据结构,例如列表,堆栈,队列与图。后面会做一个专题,用PHP实现大部分的数据结构,而且以面向对象的形式。所以这里先预热了一下PHP的迭代器。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
PHP个人网站架设连环讲(二)
Oct 09 PHP
PHP 常见郁闷问题答解
Nov 25 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
Jul 19 PHP
php提交post数组参数实例分析
Dec 17 PHP
php版交通银行网银支付接口开发入门教程
Sep 26 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
Nov 05 PHP
Symfony查询方法实例小结
Jun 28 PHP
PHP空值检测函数与方法汇总
Nov 19 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
Apr 20 PHP
PHP中的self关键字详解
Jun 23 PHP
PHP与SQL语句写一句话木马总结
Oct 11 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
Mar 22 #PHP
PHP iconv()函数字符编码转换的问题讲解
Mar 22 #PHP
PHP里的$_GET数组介绍
Mar 22 #PHP
PHP匿名函数(闭包函数)详解
Mar 22 #PHP
PHP利用递归函数实现无限级分类的方法
Mar 22 #PHP
用PHP的反射实现委托模式的讲解
Mar 22 #PHP
PHP读取目录树的实现方法分析
Mar 22 #PHP
You might like
PHP转盘抽奖接口实例
2015/02/09 PHP
php抽象类用法实例分析
2015/07/07 PHP
php链表用法实例分析
2015/07/09 PHP
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
2010/10/15 Javascript
javascript写的日历类(基于pj)
2010/12/28 Javascript
window.open不被拦截的实现代码
2012/08/22 Javascript
JavaScript中json对象和string对象之间相互转化
2012/12/26 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
2013/05/17 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
JS+Canvas实现的俄罗斯方块游戏完整实例
2016/12/12 Javascript
vue修改vue项目运行端口号的方法
2017/08/04 Javascript
Python之Scrapy爬虫框架安装及使用详解
2017/11/16 Python
python入门教程 python入门神图一张
2018/03/05 Python
selenium+python设置爬虫代理IP的方法
2018/11/29 Python
Python去除字符串前后空格的几种方法
2019/03/04 Python
python简单的三元一次方程求解实例
2020/04/02 Python
Python基础类继承重写实现原理解析
2020/04/03 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
2020/10/19 Python
使用css3实现的windows8开机加载动画
2014/12/09 HTML / CSS
英国最大的正宗复古足球衫制造商和零售商:TOFFS
2018/06/21 全球购物
千禧酒店及度假村官方网站:Millennium Hotels and Resorts
2019/05/10 全球购物
Antler英国官网:购买安特丽行李箱、拉杆箱
2019/08/25 全球购物
Marc O’Polo俄罗斯官方在线商店:德国高端时尚品牌
2019/12/26 全球购物
小学生安全保证书
2014/02/01 职场文书
陈欧的广告词
2014/03/18 职场文书
乡镇四风对照检查材料
2014/08/31 职场文书
2014教育局对照检查材料思想汇报
2014/09/23 职场文书
学校国庆节活动总结
2015/03/23 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
Nginx快速入门教程
2021/03/31 Servers
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS