1. 程式人生 > 程式設計 >PHP設計模式入門之迭代器模式原理與實現方法分析

PHP設計模式入門之迭代器模式原理與實現方法分析

本文例項講述了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來遍歷了還要用這樣一種迭代器模式來實現,只有等待工作經驗的加深來進一步理解吧。

參考文件:

https://www.jb51.net/article/184182.htm

https://www.jb51.net/article/185478.htm

https://www.jb51.net/article/185483.htm

更多關於PHP相關內容感興趣的讀者可檢視本站專題:《php面向物件程式設計入門教程》、《PHP陣列(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算子用法總結》、《php字串(string)用法總結》、《php+mysql資料庫操作入門教程》及《php常見資料庫操作技巧彙總》

希望本文所述對大家PHP程式設計有所幫助。