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如何透过ODBC来存取数据库
Oct 09 PHP
Mysql的GROUP_CONCAT()函数使用方法
Mar 28 PHP
php setcookie函数的参数说明及其用法
Apr 20 PHP
PHP类的封装与继承详解
Sep 29 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
Dec 18 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
Mar 05 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
May 23 PHP
php中输出json对象的值(实现方法)
Mar 07 PHP
PHP实现对数字分隔加千分号的方法
Mar 18 PHP
laravel5.2表单验证,并显示错误信息的实例
Sep 29 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 PHP
浅谈PHP7中的一些小技巧
May 29 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读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
2012/07/31 PHP
基于MySQL体系结构的分析
2013/05/02 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
关于PHP内存溢出问题的解决方法
2013/06/25 PHP
PHP仿微信多图片预览上传实例代码
2016/09/13 PHP
php array_slice 取出数组中的一段序列实例
2016/11/04 PHP
学习ExtJS(一) 之基础前提
2009/10/07 Javascript
jQuery validate 中文API 附validate.js中文api手册
2010/07/31 Javascript
基于jquery的给文章加入关键字链接
2010/10/26 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
2013/07/07 Javascript
JavaScript输入邮箱自动提示实例代码
2014/01/13 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
2015/06/17 Javascript
第九篇Bootstrap导航菜单创建步骤详解
2016/06/21 Javascript
js实现的光标位置工具函数示例
2016/10/03 Javascript
浅析javaScript中的浅拷贝和深拷贝
2017/02/15 Javascript
JavaScrpt判断一个数是否是质数的实例代码
2017/06/11 Javascript
React Native 图片查看组件的方法
2018/03/01 Javascript
详解Puppeteer 入门教程
2018/05/09 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
2018/08/29 Javascript
js实现多个倒计时并行 js拼团倒计时
2019/02/25 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
2019/06/21 Javascript
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
Python3随机漫步生成数据并绘制
2018/08/27 Python
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
django admin.py 外键,反向查询的实例
2019/07/26 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
2020/06/01 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
html特殊符号示例 html特殊字符编码对照表
2014/01/14 HTML / CSS
物流专业大学生的自我鉴定
2013/11/13 职场文书
个人担保书范文
2014/05/20 职场文书
家庭教育的心得体会
2014/09/01 职场文书
使用goaccess分析nginx日志的详细方法
2021/07/09 Servers
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电