PHPのIteratorAggregateインターフェースを継承してforeach文でループできるクラスを作成する

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

コメント

  1. なぜ最後の実行コードではRangeIteratorAggregateでなくRangeIteratorをnewしているんですか

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください