言語リファレンス 定義済みのインターフェイスとクラス http://php.net/manual/ja/reserved.interfaces.php
PHP マニュアル 関数リファレンス その他の基本モジュール SPL https://www.php.net/manual/ja/spl.interfaces.php
前書き
PHPでは、様々な「定義済みのインタフェース」があります。
使う使わないはともかくとして、知識として「ある」ことは理解をしておくと便利です。
イテレータ(foreach)と反復処理 / イテレータ時の位置の移動(seek)
Traversable インターフェイス
https://www.php.net/manual/ja/class.traversable.php
Traversable インターフェイスは「foreachで使えるかどうか?」を確認するためのインタフェースです。
しかし、このインタフェースを直接継承することはできません(“must implement interface Traversable as part of either Iterator or IteratorAggregate” というエラーになります)。
「引数や戻り値の型宣言」などに使うことはできるので、直接使う時は、そういった用途がよいでしょう。
Iterator インターフェイス
https://www.php.net/manual/ja/class.iterator.php
インスタンスを(foreachで)反復処理する時に、直接関わるインタフェースになります。一般的な「反復処理の時に必要なメソッド」が一通り宣言されています。別のタイミングで、「このインタフェースを実装したクラス」についても言及をしていく予定です。
IteratorAggregate インターフェイス
https://www.php.net/manual/ja/class.iteratoraggregate.php
別のクラス実装で「反復処理を行うことができる」クラスがある時に、それを取り込めるようにするためのインタフェースです。
getIterator()メソッドの戻り値に「Iterator インターフェイスを実装したクラス」等を返せるように作成します。
OuterIterator インターフェイス
https://www.php.net/manual/ja/class.outeriterator.php
Iterator インタフェースを継承した上で public getInnerIterator(): ?Iterator
のメソッドをもつインタフェースです。
書き方にもよりますが、Iteratorインタフェース実装クラス(のインスタンス)をコンストラクタ経由で渡すと、DI(Dependency Injection)のような実装も可能です。
SeekableIterator インターフェイス
https://www.php.net/manual/ja/class.seekableiterator.php
Iterator インターフェイス実装クラスの位置(position)に介入して、「好きな位置の値」を取得することができるようにします。
なお、foreach() 経由で呼ばれると rewind()
メソッドが呼ばれるので、位置情報は(基本的に)初期化されます。
このコラムに関連するコードはこちらになります
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/039.php