반복자 패턴은 동작 패턴으로, 가장 단순하고 가장 일반적인 디자인 패턴입니다. 이를 통해 사용자는 실제 기본 작업을 알지 못해도 특정 인터페이스를 통해 컨테이너의 각 요소를 검사할 수 있습니다.
적용성
PHP의 foreach 함수와 같은 사용자 정의 구조를 용이하게 하기 위해 언어 자체의 순회 함수를 사용하려는 경우
클래스 다이어그램
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, ' ', $row, '<br />'; } ?>
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('s1' => 11, 's2' => 22, 's3' => 33); $it = new CMapIterator($data); foreach ($it as $row) { echo $row, '<br />'; }
이전의 단순 구현과 비교하여 위치 변경은 키를 제어하여 수행됩니다. 이 구현의 목적은 false를 방지하는 것입니다. 배열 값으로 반복됩니다.