当前位置:首页 > PHP教程 > php面向对象 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-03-02 10:05:35 浏览: 评论:0 

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

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

题目是这样的:

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

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

sample.php

  1. <?php 
  2. class Sample implements Iterator{ 
  3.  private $_arr
  4.    
  5.  public function __construct(Array $arr){ 
  6.  $this->_arr = $arr
  7.  } 
  8.    
  9.  public function current(){ 
  10.    return current($this->_arr); 
  11.  } 
  12.    
  13.  public function next(){ 
  14.    return next($this->_arr); 
  15.  } 
  16.    
  17.  public function key(){ 
  18.    return key($this->_arr); 
  19.  } 
  20.    
  21.  public function valid(){ 
  22.    return $this->current() !== false; 
  23.  } 
  24.    
  25.  public function rewind(){ 
  26.   reset($this->_arr); 
  27.  } 

index.php

  1. <?php 
  2. require 'Sample.php'
  3.    
  4. $arr = new Sample(['max''ben''will']);  
  5.    
  6. foreach ($arr as $k=>$v){ 
  7.   echo $k."-".$v."<br />"

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

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

  1. class CMapIterator implements Iterator { 
  2. /** 
  3. * @var array the data to be iterated through 
  4. */ 
  5.   private $_d
  6. /** 
  7. * @var array list of keys in the map 
  8. */ 
  9.   private $_keys
  10. /** 
  11. * @var mixed current key 
  12. */ 
  13.   private $_key
  14.    
  15. /** 
  16. * Constructor. 
  17. * @param array the data to be iterated through 
  18. */ 
  19.   public function __construct(&$data) { 
  20.     $this->_d=&$data
  21.     $this->_keys=array_keys($data); 
  22.   } 
  23.    
  24. /** 
  25. * Rewinds internal array pointer. 
  26. * This method is required by the interface Iterator. 
  27. */ 
  28.   public function rewind() {                                          
  29.     $this->_key=reset($this->_keys); 
  30.   } 
  31.    
  32. /** 
  33. * Returns the key of the current array element. 
  34. * This method is required by the interface Iterator. 
  35. * @return mixed the key of the current array element 
  36. */ 
  37.   public function key() { 
  38.     return $this->_key; 
  39.   } 
  40.    
  41. /** 
  42. * Returns the current array element. 
  43. * This method is required by the interface Iterator. 
  44. * @return mixed the current array element 
  45. */ 
  46.   public function current() { 
  47.     return $this->_d[$this->_key]; 
  48.   } 
  49.    
  50. /** 
  51. * Moves the internal pointer to the next array element. 
  52. * This method is required by the interface Iterator. 
  53. */ 
  54.   public function next() { 
  55.     $this->_key=next($this->_keys); 
  56.   } 
  57.    
  58. /** 
  59. * Returns whether there is an element at current position. 
  60. * This method is required by the interface Iterator. 
  61. * @return boolean 
  62. */ 
  63.   public function valid() { 
  64.     return $this->_key!==false; 
  65.   } 
  66.    
  67. $data = array('s1' => 11, 's2' => 22, 's3' => 33); 
  68. $it = new CMapIterator($data); 
  69. foreach ($it as $row) { 
  70.   echo $row'<br />'

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

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

Tags: PHP设计模式 PHP迭代器

分享到: