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
apache rewrite_module模块使用教程
Jan 10 PHP
PHP 批量更新网页内容实现代码
Jan 05 PHP
PHP中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节
Jul 09 PHP
PHP中PDO的错误处理
Sep 04 PHP
php实现图形显示Ip地址的代码及注释
Jan 20 PHP
php GUID生成函数和类
Mar 10 PHP
DOM基础及php读取xml内容操作的方法
Jan 23 PHP
PHP中的Session对象如何使用
Sep 25 PHP
Zend Framework前端控制器用法示例
Dec 11 PHP
在IIS下安装PHP扩展的方法(超简单)
Apr 10 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
Oct 22 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
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
php接口和抽象类使用示例详解
2014/03/02 PHP
php常用文件操作函数汇总
2014/11/22 PHP
php显示页码分页类的封装
2017/06/08 PHP
PHP实现通过二维数组键值获取一维键名操作示例
2019/10/11 PHP
JavaScript Cookie显示用户上次访问的时间和次数
2009/12/08 Javascript
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
Javascript玩转继承(一)
2014/05/08 Javascript
基于socket.io和node.js搭建即时通信系统
2014/07/30 Javascript
AngularJS入门知识之MVW类框架的编程思想探讨
2014/12/08 Javascript
javascript实现画不相交的圆
2015/04/07 Javascript
JS输出空格的简单实现方法
2016/09/08 Javascript
如何在Angular2中使用jQuery及其插件的方法
2017/02/09 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
html5+canvas实现支持触屏的签名插件教程
2017/05/08 Javascript
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
2017/05/30 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
动态加载JavaScript文件的3种方式
2018/05/05 Javascript
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
原生JS实现的轮播图功能详解
2018/08/06 Javascript
使用python进行广告点击率的预测的实现
2019/07/04 Python
通过字符串导入 Python 模块的方法详解
2019/10/27 Python
Python matplotlib模块及柱状图用法解析
2020/08/10 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
Sunglasses Shop英国:欧洲领先的太阳镜在线供应商之一
2018/09/19 全球购物
抽象方法、抽象类怎样声明
2014/10/25 面试题
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
酒店开业庆典主持词
2014/03/21 职场文书
英语课前三分钟演讲稿(6篇)
2014/09/13 职场文书
离婚协议书包括哪些内容
2014/10/16 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
工作表现证明
2015/06/15 职场文书