日曜プログラミング

PHP好き集まれ〜!!

ArrayObjectとArrayIterator

IteratorAggregateインターフェイスを利用して
外部イテレータを指定する場合に、
ArrayObjectを利用してもArrayIteratorを利用しても同じ結果になることをメモしておきます。

ちなみにArrayObjectとArrayIteratorが何をimplementsしているかというと
ArrayObjectはIteratorAggregate,ArrayAccess,Serializable,Countableです。
ArrayIteratorはSeekableIterator,ArrayAccess,Serializable,Countableです。

またArrayObject::getIterator()の返り値の型はArrayIteratorであります。

試しに以下のコードを書きました。

<?php
//名前と年齢を格納できる人クラス
class Person {
	
	private $name;
	private $age;
	public function __construct($name,$age){
		$this->name = $name;
		$this->age = $age;
	}
	public function getName(){return $this->name;}
	public function getAge(){return $this->age;}
}
/**
  人を追加することができるGroup1クラス
  外部イテレータはArrayObjectを使ってArrayIteratorを指定
 */
class Group1 implements IteratorAggregate {
	
	private $group;
	public function __construct(){
		$this->group = new ArrayObject();
	}
	public function add(Person $person){
		$this->group[] = $person;
	}
	public function getIterator(){
		return $this->group->getIterator();
	}
}
/**
  人を追加することができるGroup2クラス
  外部イテレータはArrayIteratorを指定
 */
class Group2 implements IteratorAggregate {
	
	private $group;
	public function __construct(){
		$this->group = new ArrayIterator();
	}
	public function add(Person $person){
		$this->group[] = $person;
	}
	public function getIterator(){
		return $this->group;
	}
}

$group1 = new Group1();
$group1->add(new Person('Tani', 24));
$group1->add(new Person('Tanaka', 32));
$group1->add(new Person('Yamada', 43));
$iterator1 = $group1->getIterator();
foreach($iterator1 as $object){
	echo "名前は{$object->getName()}です。年齢は{$object->getAge()}です。\n"; 
}
echo "/*---------------*/\n";
$group2 = new Group2();
$group2->add(new Person('Tani', 24));
$group2->add(new Person('Tanaka', 32));
$group2->add(new Person('Yamada', 43));
$iterator2 = $group2->getIterator();
foreach($iterator2 as $object){
	echo "名前は{$object->getName()}です。年齢は{$object->getAge()}です。\n"; 
}
/*出力結果*/
名前はTaniです。年齢は24です。
名前はTanakaです。年齢は32です。
名前はYamadaです。年齢は43です。
/*---------------*/
名前はTaniです。年齢は24です。
名前はTanakaです。年齢は32です。
名前はYamadaです。年齢は43です。

同じ結果が出ました。