「配列やそれに類似するデータ構造の各要素に対する繰返し処理の抽象化である」
といわれても何のことだかさっぱりです。
PHPでは、配列にアクセスする際はforeachなりnextなりを使用し、
ディレクトリにアクセスする際はopendirやreaddirを使用し、
XMLを解析する場合はxml_set_element_handlerなりxml_set_character_data_handlerを使用したりするわけですが、これでは処理する相手が増えるたびに新しい関数を覚えなくてはいけなかったりして恐ろしく面倒です。
というわけでIteratorパターンなるものが編み出されました。
データ構造からデータを取得する手段を切り離すということです。
これを使用することによって、$iterator_array->next()で配列の次の値を取得し、$iterator_dir->next()で次のファイル名を取得し、$iterator_xml->next()でXMLの次の要素を取得できるようになるわけです。
とりあえず配列について簡単にIteratorを作成してみます。
例によってエラー処理は放置。
iterator_array.php 
| 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 | 
    class Iterator_array{
        
        public $array=array(
            '<',
            '<',
            '<',
            '!"#%&',
            '\''
        );
        
        function __construct(){
            $this->position=0;
        }
        
        public function current(){
            return $this->array[$this->position];
        }
        public function key(){
            return $this->position;
        }
        
        public function next(){
            $this->position++;
        }
        
        public function rewind(){
            $this->position=0;
        }
        
        public function seek($position){
            $this->position=$position;
        }
        
        public function valid(){
            return isset($this->array[$this->position]) ? true : false;
        }
        
        public function count(){
            return count($this->array);
        }
    
    #↓クラスのおわり
    } | 
index.php
| 
1
2
3
4
5
6
7
8
9
10
 | 
    
    require_once('iterator.php');
    $iter=new Iterator_array();
    
    print($iter->current());
    $iter->next();
    print($iter->current());
    $iter->seek(4);
    print($iter->current()); | 
さて、PHP5においてクラス関連機能が強化されたことに伴い、このように統一した操作を行うIteratorインターフェイスが用意されました。
せっかく自力でIterator_arrayクラスを作成したのに、内容のほぼ同じArrayIterator が実装されて俺涙目。
PR
							トラックバック
								トラックバックURL: 
							
													