PHPのIteratorAggregateインターフェースを継承すると、foreach文でループできるクラスを作成することができます。
実装しなければならないメソッドは次の1つです。
/**
* 外部イテレータを返します。
*/
public Traversable getIterator( void )
サンプルコード
前回の記事(PHPのIteratorインターフェースを継承してforeach文でループできるクラスを作成する)で作成した「RangeIterator」クラスを使用します。
//指定した範囲の整数を返すクラス
class RangeIterator implements Iterator {
private $from; //最初の数
private $to; //最後の数
private $index = 0; //現在位置
public function __construct($from, $to) {
$this->from = $from;
$this->to = $to;
}
public function current() { return $this->from + $this->index; }
public function key() { return $this->index; }
public function next() { $this->index++; }
public function rewind() { $this->index = 0; }
public function valid() { return ($this->current() < $this->to); }
}
IteratorAggregateを継承したクラス
class RangeIteratorAggregate implements IteratorAggregate
{
private $from; //最初の数
private $to; //最後の数
public function __construct($from, $to)
{
$this->from = $from;
$this->to = $to;
}
/**
* 外部イテレータを返します。
*/
public function getIterator() {
return new RangeIterator($this->from, $this->to);
}
}
実行する
$iterator = new RangeIterator(10, 20);
foreach ($iterator as $key => $value) {
echo "{$key} => {$value}\n";
}
実行結果
0 => 10
1 => 11
2 => 12
3 => 13
4 => 14
5 => 15
6 => 16
7 => 17
8 => 18
9 => 19
継承じゃなくて実装だと思います。
なぜ最後の実行コードではRangeIteratorAggregateでなくRangeIteratorをnewしているんですか