zoukankan      html  css  js  c++  java
  • PHP设计模式

    迭代器模式 (Iterator),又叫做游标(Cursor)模式。提供一种方法访问一个容器(Container)对象中各个元素,而又不需暴露该对象的内部细节。

    当你需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。另外,当需要对聚集有多种方式遍历时,可以考虑去使用迭代器模式。迭代器模式为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。

    php标准库(SPL)中提供了迭代器接口 Iterator,要实现迭代器模式,实现该接口即可。

    <?php
    class sample implements Iterator {
        private $_items ;
    
        public function __construct(&$data) {
            $this->_items = $data;
        }
        public function current() {
            return current($this->_items);
        }
    
        public function next() {
            next($this->_items);   
        }
    
        public function key() {
            return key($this->_items);
        }
    
        public function rewind() {
            reset($this->_items);
        }
    
        public function valid() {                                                                              
            return ($this->current() !== FALSE);
        }
    }
    
    // client
    $data = array(1, 2, 3, 4, 5);
    $sa = new sample($data);
    foreach ($sa AS $key => $row) {
        echo $key, ' ', $row, '<br />';
    }
    /* 输出:
    0 1
    1 2
    2 3
    3 4
    4 5 */
    
    //Yii FrameWork Demo
    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 />';
    }
    
    /* 输出:
    11
    22
    33 */
    ?>
    
  • 相关阅读:
    app.config应该放哪?
    Connection 和Dispose的学习日志
    简单的sqlhelper的学习日志
    EF 事务(非分布式事务)
    Angularjs 地址联动2.1.1
    C# 如何物理删除有主外键约束的记录?存储过程实现
    C# 枚举基本用法及扩展方法
    JS 去除重复元素的方法
    MVC4程序运行报错
    ASP.NET MVC4 & Entity Framework 6.0 IIS 部署出错解决方案
  • 原文地址:https://www.cnblogs.com/taozi32/p/9226824.html
Copyright © 2011-2022 走看看