개요
Iterator 인터페이스는 추상 인터페이스인 Traversable을 확장(extends)한 인터페이스입니다. PHP는 일상적인 반복 작업을 손쉽게 처리할 수 있도록 다양한 내장 이터레이터, 즉 SPL 이터레이터를 제공합니다. 대표적인 예로 ArrayIterator, DirectoryIterator 등이 있습니다.
사용자가 직접 정의한 클래스에서 Iterator 인터페이스를 구현하려면, 해당 인터페이스에 선언된 추상 메서드들을 모두 구현해야 합니다.
문법
Iterator extends Traversable {
/* 메서드 */
abstract public current ( void ) : mixed
abstract public key ( void ) : scalar
abstract public next ( void ) : void
abstract public rewind ( void ) : void
abstract public valid ( void ) : bool
}
메서드 종류
Iterator::current — 현재 요소를 반환합니다.
Iterator::key — 현재 요소의 키(key)를 반환합니다.
Iterator::next — 내부 포인터를 다음 요소로 이동시킵니다.
Iterator::rewind — 이터레이터를 첫 번째 요소로 되돌립니다.
Iterator::valid — 현재 위치가 유효한지 검사합니다.
Traversable을 확장하는 IteratorAggregate 또는 Iterator 인터페이스를 구현할 때는, implements 절에서 해당 인터페이스 이름이 반드시 다른 인터페이스보다 앞에 나열되어야 합니다.
Iterator 구현 예제
아래 PHP 스크립트에서는 배열을 private 프로퍼티로 가진 클래스가 Iterator 인터페이스를 구현하고 있습니다. Iterator의 추상 메서드들을 구현하면, foreach 루프뿐만 아니라 next() 메서드를 통해서도 배열을 순회할 수 있습니다.
예제 코드
<?php
class myIterator implements Iterator {
private $index = 0;
private $arr = array(10,20,30,40);
public function __construct() {
$this->index = 0;
}
public function rewind() {
$this->index = 0;
}
public function current() {
return $this->arr[$this->index];
}
public function key() {
return $this->index;
}
public function next() {
++$this->index;
}
public function valid() {
return isset($this->arr[$this->index]);
}
}
?>
foreach로 순회하기
foreach 루프를 사용하면 myIterator 객체의 배열 프로퍼티를 간단하게 순회할 수 있습니다.
$it = new myIterator();
foreach($it as $key => $value) {
echo "$key=>". $value ."\n";
}
while 루프와 next()로 순회하기
반복은 while 루프에서 next() 메서드를 호출하는 방식으로도 수행할 수 있습니다. 단, 루프를 시작하기 전에 반드시 rewind()를 호출하여 이터레이터를 처음 위치로 되돌려 주어야 합니다.
$it->rewind();
do {
echo $it->key() . "=>" .$it->current() . "\n";
$it->next();
}
while ($it->valid());
실행 결과
두 방식 모두 배열 프로퍼티를 순회하면 아래와 같은 동일한 결과가 출력됩니다.
0=>10 1=>20 2=>30 3=>40