イテレータ/「Iterator」インターフェイス
http://www.shigeweb.jp/php/project_p/?section=php5oop&page=iteration
イテレーション
イテレータ/「Iterator」インターフェイス
配列やオブジェクトのプロパティは、「foreach文」によって反復(イテレーション)して走査する事が出来ましたが、これは「foreach文」が “「コレクション」を走査する機能”を持っていたからです。一方「for文」や「while文」は同じ反復文であってもそのような機能を持たないため走査が出来ません。「コレクション」とは、配列やオブジェクト(のプロパティ)の様な、“要素の集まりを持つ構造体”の事です。
“走査する機能”の具体的な内容は、配列の内部ポインタ(現在配列の何処を指しているかを示すもの)の移動や、ポインタが指す要素の有効性(ポインタが指す位置に要素があるか否か)のチェック等です。「foreach文」で配列を走査しようとすると、まずポインタが先頭要素を指すように初期化し、ループが開始されます。ループごとに現在ポインタが指す要素や添え字を返し、ポインタを1つ先の要素に移動し、移動先に要素があるか否かをチェック、無い(配列の要素数を超えた)場合にループから抜けます。これら全てを「foreach文」は自動的に実行してくれるのです。「for文」や「while文」で配列の走査を行う場合は、ポインタの移動を行う関数等を使用する必要があります。
ここで疑問が。オブジェクトの場合はどうやって走査しているのか。それは、アクセス可能なプロパティへのリファレンスを何処かの配列に格納し、その配列に対して走査を行っているんです。多分(オイ)。
配列やオブジェクトの走査は「foreach文」が持つ“走査する機能”によって行われますが、この“走査する機能”が機能するのは、配列やオブジェクトが“走査される能力”を持っているからです。で、この配列やオブジェクトが持つ“走査される能力”を「イテレータ」と呼びます。この「イテレータ」は「Iterator」インターフェイス(「foreach文」によって走査される「イテレータ」としての機能を備える)として定義されていて、この定義済みインターフェイスを(ちゃんと機能するように)実装して、自作の「イテレータ」を作る事が出来ます。
「Iterator」インターフェイスを実装したクラスのオブジェクトを「foreach文」で走査しようとすると、そのオブジェクトが持つ「イテレータ」が実行されるようになります(各種メソッドが丁度“特殊メソッド”の様に自動的にコールされる)。
当然、「Iterator」インターフェイスを実装する際は、各種メソッドが「イテレータ」として機能するように処理部を実装しないと、正常に機能しません。