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 Ajax中文乱码问题解决方法
Feb 27 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
Apr 12 PHP
php使HTML标签自动补全闭合函数代码
Oct 04 PHP
php实现过滤表单提交中html标签的方法
Oct 17 PHP
四种php中webservice实现的简单架构方法及实例
Feb 03 PHP
codeigniter中实现一次性加载多个view的方法
Mar 20 PHP
PHP6新特性分析
Mar 03 PHP
PHP使用curl模拟post上传及接收文件的方法
Mar 04 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
Apr 03 PHP
PHP利用DWZ.CN服务生成短网址
Aug 11 PHP
php模拟post提交请求调用接口示例解析
Aug 07 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
Sep 17 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
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
php中simplexml_load_string使用实例分享
2014/02/13 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
如何实现浏览器上的右键菜单
2006/07/10 Javascript
Function.prototype.call.apply结合用法分析示例
2013/07/03 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
jquery使用slideDown实现模块缓慢拉出效果的方法
2015/03/27 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
2015/09/15 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
2017/02/17 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
2018/04/19 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
如何对react hooks进行单元测试的方法
2019/08/14 Javascript
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
如何解决vue在ios微信&quot;复制链接&quot;功能问题
2020/03/26 Javascript
vue-cli3 热更新配置操作
2020/09/18 Javascript
python中reload(module)的用法示例详解
2017/09/15 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
python @propert装饰器使用方法原理解析
2019/12/25 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
2020/10/29 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
css3 transform导致子元素固定定位变成绝对定位的方法
2020/03/06 HTML / CSS
草莓网化妆品加拿大网站:Strawberrynet Canada
2016/09/20 全球购物
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
会计电算化大学生职业规划书
2014/02/05 职场文书
幼儿园五一活动方案
2014/02/07 职场文书
高二学生评语大全
2014/04/25 职场文书
领导欢迎词范文
2015/01/26 职场文书
职代会闭幕词
2015/01/28 职场文书
2016民族团结先进个人事迹材料
2016/02/26 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
Python requests用法和django后台处理详解
2022/03/19 Python