PHPのIteratorの履歴
Zend FrameworkはSPLのIterator使ってるのが多い。
インタフェース
Iterator
実装すればforeachで回すことができる
http://jp2.php.net/manual/ja/class.iterator.php
<?php class myIterator implements Iterator { private $position = 0; private $array = array( "firstelement", "secondelement", "lastelement", ); public function __construct() { $this->position = 0; } function rewind() { var_dump(__METHOD__); $this->position = 0; } function current() { var_dump(__METHOD__); return $this->array[$this->position]; } function key() { var_dump(__METHOD__); return $this->position; } function next() { var_dump(__METHOD__); ++$this->position; } function valid() { var_dump(__METHOD__); return isset($this->array[$this->position]); } } $it = new myIterator; foreach($it as $key => $value) { var_dump($key, $value); echo "\n"; } ?>
IteratorAggregate
getIterator()を持つ。他のiteratorを持っていて、それを使いたい場合にproxy的に使う。
RecursiveIterator
ツリー構造をトラバースする時に使えそうだけど、まだ使う機会がない
SeekableIterator
インデックス指定ができる。例えばZend_Service_Amazon_ResultSetが実装している。
OuterIterator
Iteratorをラップする。getInnerIteratorを持つ。
クラス
ArrayIterator
arrayをIteratorにしたいときに
DirectoryIterator
FilterIterator
OuterIteratorを実装。抽象クラス。accept()でフィルタリングできる。callbackで指定できればわざわざクラス作らなくてもいいのになぁ。
LimitIterator
指定位置から返したり、指定数を返したりできる。
例えばこんな感じで配列から指定条件を指定数取得できるんじゃね。
$it = new LimitIterator(new MyFilterIterator(new ArrayIterator($array)), 0, 10); class MyFilterIterator extends FilterIterator{ function accept(){ // return boolean } }
参考
http://php.net/manual/ja/language.oop5.iterations.php
http://www.php.net/manual/ja/spl.iterators.php
http://devzone.zend.com/article/2565