PHP设计模式入门之迭代器模式原理与实现方法分析


Posted in PHP onApril 26, 2020

本文实例讲述了PHP设计模式入门之迭代器模式。分享给大家供大家参考,具体如下:

在深入研究这个设计模式之前,我们先来看一道面试题,来自鸟哥的博客,

题目是这样的:

使对象可以像数组一样进行foreach循环,要求属性必须是私有。

不使用迭代器模式很难实现,先看实现的代码:

sample.php

<?php
class Sample implements Iterator{
 private $_arr;
 
 public function __construct(Array $arr){
 $this->_arr = $arr;
 }
 
 public function current(){
   return current($this->_arr);
 }
 
 public function next(){
   return next($this->_arr);
 }
 
 public function key(){
   return key($this->_arr);
 }
 
 public function valid(){
   return $this->current() !== false;
 }
 
 public function rewind(){
  reset($this->_arr);
 }
}

index.php

<?php
require 'Sample.php';
 
$arr = new Sample(['max', 'ben', 'will']); 
 
foreach ($arr as $k=>$v){
  echo $k."-".$v."<br />";
}

其中Iterator接口来自php的spl类库,在写完设计模式的相关文章之后,将会进一步研究这个类库。

另外在网上找到了一段yii框架中关于迭代器模式的实现代码:

class CMapIterator implements Iterator {
/**
* @var array the data to be iterated through
*/
  private $_d;
/**
* @var array list of keys in the map
*/
  private $_keys;
/**
* @var mixed current key
*/
  private $_key;
 
/**
* Constructor.
* @param array the data to be iterated through
*/
  public function __construct(&$data) {
    $this->_d=&$data;
    $this->_keys=array_keys($data);
  }
 
/**
* Rewinds internal array pointer.
* This method is required by the interface Iterator.
*/
  public function rewind() {                                         
    $this->_key=reset($this->_keys);
  }
 
/**
* Returns the key of the current array element.
* This method is required by the interface Iterator.
* @return mixed the key of the current array element
*/
  public function key() {
    return $this->_key;
  }
 
/**
* Returns the current array element.
* This method is required by the interface Iterator.
* @return mixed the current array element
*/
  public function current() {
    return $this->_d[$this->_key];
  }
 
/**
* Moves the internal pointer to the next array element.
* This method is required by the interface Iterator.
*/
  public function next() {
    $this->_key=next($this->_keys);
  }
 
/**
* Returns whether there is an element at current position.
* This method is required by the interface Iterator.
* @return boolean
*/
  public function valid() {
    return $this->_key!==false;
  }
}
 
$data = array('s1' => 11, 's2' => 22, 's3' => 33);
$it = new CMapIterator($data);
foreach ($it as $row) {
  echo $row, '<br />';
}

关于迭代器设计模式官方的定义是:使用迭代器模式来提供对聚合对象的统一存取,即提供一个外部的迭代器来对聚合对象进行访问和遍历 , 而又不需暴露该对象的内部结构。又叫做游标(Cursor)模式。

好吧,我不是很能理解。为什么明明数组已经可以用foreach来遍历了还要用这样一种迭代器模式来实现,只有等待工作经验的加深来进一步理解吧。

参考文档:

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP 中的一些经验积累
Oct 09 PHP
php at(@)符号的用法简介
Jul 11 PHP
php实现用户在线时间统计详解
Oct 08 PHP
微信营销平台系统?刮刮乐的开发
Jun 10 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
Aug 11 PHP
thinkphp3.2.2实现生成多张缩略图的方法
Dec 19 PHP
PHP加密解密类实例分析
Apr 20 PHP
yii的入口文件index.php中为什么会有这两句
Aug 04 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
Feb 15 PHP
php二维数组按某个键值排序的实例讲解
Feb 15 PHP
php5对象复制、clone、浅复制与深复制实例详解
Aug 14 PHP
php+websocket 实现的聊天室功能详解
May 27 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
Apr 26 #PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
Apr 26 #PHP
Yii Framework框架开发微信公众平台示例
Apr 26 #PHP
PHP随机生成中文段落示例【测试网站内容时使用】
Apr 26 #PHP
PHP过滤器 filter_has_var() 函数用法实例分析
Apr 23 #PHP
PHP优化之批量操作MySQL实例分析
Apr 23 #PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
Apr 23 #PHP
You might like
php实现文件下载功能的几个代码分享
2014/05/10 PHP
浅谈PHP无限极分类原理
2019/03/14 PHP
PHP如何开启Opcache功能提升程序处理效率
2020/04/27 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
javascript中slice(),splice(),split(),substring(),substr()使用方法
2015/03/13 Javascript
实例讲解JavaScript中的this指向错误解决方法
2016/06/13 Javascript
Google 地图API Map()构造器详解
2016/08/06 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
JavaScript实现兼容IE6的收起折叠与展开效果实例
2017/09/20 Javascript
用jquery获取select标签中选中的option值及文本的示例
2018/01/25 jQuery
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
vue实现多个元素或多个组件之间动画效果
2018/09/25 Javascript
js for终止循环 跳出多层循环
2018/10/04 Javascript
iView框架问题整理小结
2018/10/16 Javascript
详解async/await 异步应用的常用场景
2019/05/13 Javascript
微信小程序以7天为周期连续签到7天功能效果的示例代码
2020/08/20 Javascript
elementui实现预览图片组件二次封装
2020/12/29 Javascript
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
[03:41]DOTA2上海特锦赛小组赛第三日recap精彩回顾
2016/02/28 DOTA
[53:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第三场 6.2
2018/06/03 DOTA
以一段代码为实例快速入门Python2.7
2015/03/31 Python
Python用threading实现多线程详解
2017/02/03 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
python的pygal模块绘制反正切函数图像方法
2019/07/16 Python
Windows下python3安装tkinter的问题及解决方法
2020/01/06 Python
小学毕业寄语大全
2014/04/03 职场文书
质量承诺书格式
2014/05/20 职场文书
无毒社区工作方案
2014/05/23 职场文书
2015年党建工作汇报材料
2015/06/25 职场文书
海底两万里读书笔记
2015/06/26 职场文书
校园新闻稿范文
2015/07/18 职场文书
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python