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 归并排序 数组交集
May 10 PHP
php设计模式 Interpreter(解释器模式)
Jun 26 PHP
shopex主机报错误请求解决方案(No such file or directory)
Dec 27 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
Jan 11 PHP
php mail to 配置详解
Jan 16 PHP
php中多维数组按指定value排序的实现代码
Aug 19 PHP
smarty中post用法实例
Nov 28 PHP
wordpress安装过程中遇到中文乱码的处理方法
Apr 21 PHP
用PHP生成excel文件到指定目录
Jun 22 PHP
Zend Framework框架Smarty扩展实现方法
Mar 22 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
Aug 29 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 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
一些花式咖啡的配方
2021/03/03 冲泡冲煮
PHP中MD5函数使用实例代码
2008/06/07 PHP
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
百度ping方法使用示例 自动ping百度
2014/01/26 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
php跨服务器访问方法小结
2015/05/12 PHP
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
在线游戏大家来找茬II
2006/09/30 Javascript
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
教你如何使用PHP输出中文JSON字符串
2014/05/22 Javascript
node.js中的fs.readdirSync方法使用说明
2014/12/17 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
JavaScript实现in-place思想的快速排序方法
2016/08/07 Javascript
Web安全测试之XSS实例讲解
2016/08/15 Javascript
详解AngularJs HTTP响应拦截器实现登陆、权限校验
2017/04/11 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
详解webpack的配置文件entry与output
2017/08/21 Javascript
JS数组交集、并集、差集的示例代码
2017/08/23 Javascript
python实现socket端口重定向示例
2014/02/10 Python
使用Python编写一个模仿CPU工作的程序
2015/04/16 Python
Python hashlib模块用法实例分析
2018/06/12 Python
python利用selenium进行浏览器爬虫
2019/04/25 Python
python自动循环定时开关机(非重启)测试
2019/08/26 Python
Python正则表达式急速入门(小结)
2019/12/16 Python
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
《天安门广场》教学反思
2014/04/23 职场文书
物流管理专业自荐信
2014/06/23 职场文书
个性车贴标语
2014/06/24 职场文书
2015年个人现实表现材料
2014/12/10 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
搞笑Gif:这么白这么长的腿像极了一楼的女朋友
2022/03/21 杂记
SpringBoot2零基础到精通之数据与页面响应
2022/03/22 Java/Android