>백엔드 개발 >PHP 튜토리얼 >반복자 패턴 및 해당 PHP 구현(Yii 프레임워크)

반복자 패턴 및 해당 PHP 구현(Yii 프레임워크)

伊谢尔伦
伊谢尔伦원래의
2016-12-01 13:05:571245검색

반복자 패턴은 동작 패턴으로, 가장 단순하고 가장 일반적인 디자인 패턴입니다. 이를 통해 사용자는 실제 기본 작업을 알지 못해도 특정 인터페이스를 통해 컨테이너의 각 요소를 검사할 수 있습니다.

적용성

PHP의 foreach 함수와 같은 사용자 정의 구조를 용이하게 하기 위해 언어 자체의 순회 함수를 사용하려는 경우

클래스 다이어그램

반복자 패턴 및 해당 PHP 구현(Yii 프레임워크)

PHP 인스턴스

<?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, &#39; &#39;, $row, &#39;<br />&#39;;
}
?>

Yii 프레임워크의 구현:

Yii 프레임워크의 컬렉션 디렉토리에서 반복자의 구현을 볼 수 있습니다. CMapIterator.php 파일의 구현은 다음과 같습니다.

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(&#39;s1&#39; => 11, &#39;s2&#39; => 22, &#39;s3&#39; => 33);
$it = new CMapIterator($data);
foreach ($it as $row) {
    echo $row, &#39;<br />&#39;;
}

이전의 단순 구현과 비교하여 위치 변경은 키를 제어하여 수행됩니다. 이 구현의 목적은 false를 방지하는 것입니다. 배열 값으로 반복됩니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.