PHP - Iterable

Iterable

Iterable は PHP 7.1 で導入された疑似型です。array、あるいは Traversable インターフェイスを実装したオブジェクトを許容します。これらの型は、foreach で繰り返し可能で、ジェネレータ内で yield from できます。

Iterable は、関数が値のセットを要求しますが foreach を使うため、値の形式は問わないことを示すパラメータ型として使用できます。値が、配列でも Traversable のインスタンスでもない場合は、TypeError がスローされます。

<?php
  $iterable = array(1, 2, 3);

  foreach ($iterable as $value) {
    echo $value; // 123
  } 
?>
Iterable パラメータ型の例

Iterable は、繰り返し可能な値を関数が返すことを示すため、戻り値の型としても使用できます。戻り値が、配列でも Traversable の インスタンスでもない場合、TypeError がスローされます。

<?php
  function bar(): iterable {
    return [1, 2, 3];
  }
?>
Iterable 戻り値の例

戻り値の型として Iterable を宣言する関数は、ジェネレータにもなります。

<?php
  function gen(): iterable {
    yield 1;
    yield 2;
    yield 3;
  }
?>
Iterable 戻り値のジェネレータの例

継承したクラス、あるいはインターフェイスを実装したクラスは、パラメータ型に arrayTraversable を使っているメソッドを Iterable に拡張できます。また、戻り値の型を Iterable から arrayTraversable に縮小できます。

<?php
  interface Example {
    public function method(array $array): iterable;
  }

  class ExampleImplementation implements Example {
      public function method(iterable $iterable): array {
          // ...
      }
  }
?>
Iterable 型の可変性の例

関連記事