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的header和asp中的redirect比较
Oct 09 PHP
PHP经典的给图片加水印程序
Dec 06 PHP
PHP字符转义相关函数小结(php下的转义字符串)
Apr 12 PHP
PHP 遍历XP文件夹下所有文件
Nov 27 PHP
PHP面向对象——访问修饰符介绍
Nov 08 PHP
自编函数解决pathinfo()函数处理中文问题
Nov 03 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
Apr 07 PHP
php获取POST数据的三种方法实例详解
Dec 20 PHP
php进程daemon化的正确实现方法
Sep 06 PHP
PHP如何根据文件头检测文件类型实例代码
Oct 14 PHP
Laravel框架Request、Response及Session操作示例
May 06 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
Aug 03 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
生成sessionid和随机密码的例子
2006/10/09 PHP
PHP session有效期问题
2009/04/26 PHP
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
2011/05/09 PHP
jQuery下的动画处理总结
2013/10/10 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
2014/05/12 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
axios基本入门用法教程
2017/03/25 Javascript
ligerUI---ListBox(列表框可移动的实例)
2017/11/28 Javascript
vue底部加载更多的实例代码
2018/06/29 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
一百行JS代码实现一个校验工具
2019/04/30 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
在vue中使用console.log无效的解决
2020/08/09 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
Python使用新浪微博API发送微博的例子
2014/04/10 Python
Python中的index()方法使用教程
2015/05/18 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
Python符号计算之实现函数极限的方法
2019/07/15 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
python里反向传播算法详解
2020/11/22 Python
python Timer 类使用介绍
2020/12/28 Python
python 基于UDP协议套接字通信的实现
2021/01/22 Python
HTML最新标准HTML5总结(必看)
2016/06/13 HTML / CSS
德国高品质男装及配饰商城:Cultizm(Raw Denim原色牛仔裤)
2018/04/16 全球购物
农民工工资发放承诺书
2014/03/31 职场文书
初三开学计划书
2014/04/27 职场文书
招商引资工作汇报
2014/10/28 职场文书
会计稽核岗位职责
2015/04/13 职场文书
工作服管理制度范本
2015/08/06 职场文书
安全生产学习心得体会
2016/01/18 职场文书
利用Python第三方库实现预测NBA比赛结果
2021/06/21 Python
python实现简单的聊天小程序
2021/07/07 Python
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js