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 相关文章推荐
我的论坛源代码(七)
Oct 09 PHP
PHP中使用CURL伪造来路抓取页面或文件
May 04 PHP
PHP中usort在值相同时改变原始位置问题的解决方法
Nov 27 PHP
php预定义变量使用帮助(带实例)
Oct 30 PHP
CI框架学习笔记(二) -入口文件index.php
Oct 27 PHP
php中异常处理方法小结
Jan 09 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
Dec 08 PHP
php防止CC攻击代码 php防止网页频繁刷新
Dec 21 PHP
win平台安装配置Nginx+php+mysql 环境
Jan 12 PHP
CentOS 上搭建 PHP7 开发测试环境
Feb 26 PHP
基于Laravel5.4实现多字段登录功能方法示例
Aug 11 PHP
PHP折半(二分)查找算法实例分析
May 12 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中http_build_query 的一个问题
2012/03/25 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
php数组去重的函数代码
2013/02/03 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
jQuery+jqmodal弹出窗口实现代码分明
2010/06/14 Javascript
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
javascript日期格式化方法汇总
2015/10/04 Javascript
jQuery简单获取键盘事件的方法
2016/01/22 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
整理关于Bootstrap导航的慕课笔记
2017/03/29 Javascript
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
javascript将json格式数组下载为excel表格的方法
2017/12/22 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
python相似模块用例
2016/03/04 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
python调用百度REST API实现语音识别
2018/08/30 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
python 字符串常用方法汇总详解
2019/09/16 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
jupyter实现重新加载模块
2020/04/16 Python
如何将PySpark导入Python的放实现(2种)
2020/04/26 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
html5的localstorage详解
2017/05/09 HTML / CSS
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
试解释COMMIT操作和ROLLBACK操作的语义
2014/07/25 面试题
手工社团活动方案
2014/02/17 职场文书
申论倡议书范文
2014/05/13 职场文书
班级活动总结格式
2014/08/30 职场文书
承诺书范本大全
2015/05/04 职场文书