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小程序自动提交到自助友情连接
Nov 24 PHP
PHP array_push 数组函数
Dec 26 PHP
编写php应用程序实现摘要式身份验证的方法详解
Jun 08 PHP
探讨捕获php错误信息方法的详解
Jun 09 PHP
PHP设计模式之解释器模式的深入解析
Jun 13 PHP
php二分查找二种实现示例
Mar 12 PHP
PHP实现PDO的mysql数据库操作类
Dec 12 PHP
PHP动态柱状图实现方法
Mar 30 PHP
php从文件夹随机读取文件的方法
Jun 01 PHP
CodeIgniter与PHP5.6的兼容问题
Jul 16 PHP
php ci 获取表单中多个同名input元素值的代码
Mar 25 PHP
php获取是星期几的的一些常用姿势
Dec 15 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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
PHP+swoole实现简单多人在线聊天群发
2016/01/19 PHP
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
JavaScript中Function详解
2015/02/27 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
2015/06/01 Javascript
javascript基本算法汇总
2016/03/09 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
jQuery表格的维护和删除操作
2017/02/03 Javascript
jQuery插件echarts实现的多折线图效果示例【附demo源码下载】
2017/03/04 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
2017/03/08 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
JavaScript初学者必看“new”
2017/06/12 Javascript
浅谈Vue 初始化性能优化
2017/08/31 Javascript
node.js学习之断言assert的使用示例
2017/09/28 Javascript
基于vue 实现token验证的实例代码
2017/12/14 Javascript
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
Vue多环境代理配置方法思路详解
2019/06/21 Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
2019/10/16 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
跟老齐学Python之用while来循环
2014/10/02 Python
Python转换HTML到Text纯文本的方法
2015/01/15 Python
django删除表重建的实现方法
2019/08/28 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
2021/01/28 Python
美国休闲服装品牌:J.Crew Factory
2017/03/04 全球购物
REN Clean Skincare官网:英国本土有机护肤品牌
2019/02/23 全球购物
Python文件操作的面试题
2013/06/22 面试题
自我评价个人范文
2013/12/16 职场文书
高中政治教学反思
2014/01/18 职场文书
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers