hnwの日記

PHP5.5のジェネレータをSPLのイテレータと組み合わせてみる

リリースが間近になったPHP5.5ではジェネレータが導入される予定です。これはイテレータを簡単に記述する文法を導入するもので、Pythonのジェネレータに非常に良く似ています。


もう少し詳しく説明しましょう。PHP5.5では、yieldというキーワードが導入されました。これはジェネレータで値を受け渡すための構文です。このyieldを含む関数はジェネレータ関数と呼ばれます。関数がジェネレータ関数かどうかは、PHPの解釈のタイミングで自動的に判断されます。


ジェネレータ関数が呼ばれると、ジェネレータ関数に対応するジェネレータオブジェクトが返されます。関数呼び出しの時点ではジェネレータ関数の中身は1行も実行されません。ジェネレータオブジェクトから値を取り出すタイミングで初めてジェネレータ関数の先頭からyield文までが実行され、yieldされた値を取り出して停止します。イテレータから次の値を取り出すと、関数の実行を再開して次のyieldまでが実行されます。


具体例を示します。2回のyieldの前後でechoするようなジェネレータをforeachで回してみましょう。

続きを読む