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です。
同じ結果が出ました。