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 相关文章推荐
第十四节 命名空间 [14]
Oct 09 PHP
谈谈PHP语法(5)
Oct 09 PHP
php图片验证码代码
Mar 27 PHP
PHP STRING 陷阱原理说明
Jul 24 PHP
php图片的裁剪与缩放生成符合需求的缩略图
Jan 11 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
Dec 15 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
Jan 08 PHP
PHP 生成微信红包代码简单
Mar 25 PHP
php基于curl主动推送最新内容给百度收录的方法
Oct 14 PHP
PHP编程计算文件或数组中单词出现频率的方法
May 22 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
May 27 PHP
Laravel模糊查询区分大小写的实例
Sep 29 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
如何删除多级目录
2006/10/09 PHP
PHP 上传文件的方法(类)
2009/07/30 PHP
PHP判断手机是IOS还是Android
2015/12/09 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
详解阿里云视频直播PHP-SDK接入教程
2020/07/09 PHP
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
js获取会话框prompt的返回值的方法
2015/01/10 Javascript
一个简单的JavaScript Map实例(分享)
2016/08/03 Javascript
详解Node.js利用node-git-server快速搭建git服务器
2017/09/27 Javascript
小程序绑定用户方案优化小结
2019/05/15 Javascript
javascript实现自由编辑图片代码详解
2019/06/21 Javascript
解决Vue watch里调用方法的坑
2020/11/07 Javascript
[02:14]DOTA2英雄基础教程 修补匠
2013/12/23 DOTA
[01:03:38]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS CIS
2014/05/22 DOTA
[54:26]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第一场 12.10
2020/12/12 DOTA
零基础写python爬虫之神器正则表达式
2014/11/06 Python
Python实现遍历数据库并获取key的值
2015/05/17 Python
用不到50行的Python代码构建最小的区块链
2017/11/16 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
对django 模型 unique together的示例讲解
2019/08/06 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
2019/10/17 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
阿姆斯特丹杜莎夫人蜡像馆官方网站:Madame Tussauds Amsterdam
2019/03/12 全球购物
婚纱摄影师求职信
2014/03/07 职场文书
平安建设实施方案
2014/03/19 职场文书
投资意向书范本
2014/04/01 职场文书
保险内勤岗位职责
2014/04/05 职场文书
总经理岗位职责
2015/02/04 职场文书
大学学生个人总结
2015/02/15 职场文书
2015年超市收银员工作总结
2015/04/25 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
go语言中json数据的读取和写出操作
2021/04/28 Golang
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP