古庄親方の上級試験コラム#039 言語リファレンス 定義済みのインタフェース

言語リファレンス 定義済みのインターフェイスとクラス 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

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次