ーぽーの日々スマートフォン用の表示で見るぱーぽーの日々2017-07-06PHP5.5で追加されたジェネレータについて調べたPHP前にまとめたPHP5系で追加された機能を振り返る記事の続き。今回は、ほぼ知らなかったジェネレータについて調べた。サンプルコードを多めに載せ、まとめていく。ジェネレータとはジェネレータとは、イテレータのような反復処理をシンプルに実装できる構文である。range()関数をジェネレータで実装し直すと以下のようになる。9}通常のrange()関数の場合、指定された範囲の値を含む配列を返すため、配列のサイズ分メモリを使用してしまうが、xRange()関数のようなジェネレータ関数を実装することでメモリの節約をすることができる。ジェネレータの構文についてyieldキーワードジェネレータ関数で最も重要となるのが、このyieldキーワードである。returnのように値を返して関数の処理が終了するのではなく、yieldはジェネレータ関数の呼び出し元に値を返し、そこでジェネレータ関数の実行を一時停止する。上記のxRange()関数のように、ジェネレータ関数内でループ中であっても、処理を一時停止し、再びループを再開することができる。yieldは以下のようなキーと値のペアを返すこともできる。}}Generatorクラスについてジェネレータ関数が最初に呼び出されたとき、Generatorクラスのオブジェクトを返す。このオブジェクトはIteratorインターフェイスを実装していて、このオブジェクトのメソッドを使用することで、ジェネレータを操作することができる。上のgetRandomValue()関数の呼び出しは以下のように書き換えることもできる。ジェネレータを続行する}Generatorクラスは他にも便利なメソッドがあるが、それらについては後述する。インタラクションについてGeneratorクラスにはsend()メソッドが備わっている。このメソッドは、指定した値をyieldの結果としてジェネレータに送ることができる。これを用いることで、双方向で値を受け渡しすることができ、例えば、以下のような数あてゲームのようなことができるようになる。fromキーワードこのキーワードを用いることで、別のジェネレータやTraversableオブジェクトや配列から順に値を取り出し、それぞれの値をyieldすることができる。6}returnキーワードPHP5まではジェネレータ関数内でreturnできなかった。returnされたタイミングでジェネレータ関数は終了し、このreturnの戻り値は通常のreturnのように値を受け取るのではなく、GeneratorクラスのgetReturn()メソッドで取得することができる。PHP_EOL;所感ジェネレータをうまく活用しているのをこれまでほとんど見たことがないので、どのように活用すれば良いかパッと思いつかないが、PHPの機能としてはとても面白いと思った。»プロフィールid:purple_jwlプログラミングやボードゲームなど、自分の好きなことを書くブログです。(12)月別アーカイブはてなブログをはじめよう!purple_jwlさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。