PHP Iteratorインターフェースを勉強してみた

notoです。

FrameWorkなどを利用すると、オブジェクト指向をあまり意識せずにWebアプリケーションの制作ができてしまいます。 オブジェクト指向で組むとクラスやファイル数が多くなったり、可読性は若干悪くなったりしますが、拡張性は格段に上がるためメンテナンスの工数が少なく抑えられたり、影響範囲が把握しやすいメリットはあると思います。

ということで、今回はIteratorインターフェースをちらっと勉強してみました。

概要

Iteratorインターフェースを実装したクラスはforeachに渡してループさせることができます。 便利!!(実務では使いどころがなさそうだけど。。。)

Iteratorインターフェースを実装するには5つのメソッドを実装する必要があります。

  • rewind() : 参照している要素を最初に戻す
  • current() : 現在参照している要素の値を返す
  • key() : 現在参照している要素のキーを返す
  • next() : 次の値を参照する
  • valid() : 現在参照している値が有効かどうかを調べる

呼び出し順

  1. rewind()メソッドが呼ばれイテレータが参照する要素を先頭に戻す
  2. valid()メソッドが呼ばれ、参照している要素が有効ならばcurrent()メソッドやkey()メソッドを呼び出し、値とキーを取得する。
  3. nextメソッドが呼び出され次の要素を参照する。
  4. valid()メソッドが呼び出される。
  5. valid()メソッドがfalseを返すまでループ。

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
45
46
<?php
class MyIterator implements Iterator {

    private $var = array();

    public function __construct($array){
        if (is_array($array)) {
            $this->var = $array;
        }
    }

    public function rewind()
    {
        reset($this->var);
    }

    public function current()
    {
        return current($this->var);
    }

    public function key()
    {
        return key($this->var);
    }

    public function next()
    {
        return next($this->var);
    }

    public function valid()
    {
        $key = key($this->var);
        return ($key !== NULL && $key !== FALSE);
    }

}

$values = array(1,2,3);
$it = new MyIterator($values);

foreach ($it as $key => $value) {
    print "$key: $value\n";
}
?>

出力結果

1
2
3
0: 1
1: 2
2: 3

Iteratorインターフェースを利用すれば、Iteratorインターフェースを実装したクラスを配列に格納して、そこから取り出したオブジェクト内でまたループできるということができるね。

参考文献

オブジェクトの反復処理 パーフェクトPHP

Comments