古庄親方の上級試験コラム#037 言語リファレンス ジェネレータ

http://php.net/manual/ja/language.generators.php

目次

前書き

ジェネレータは、必ずしも「使わないと業務のコードが全くかけない」類いのものではない、と思います。
しかし、書ける事によって「メモリの効率が上がる」など、いくつかメリットがあります。
こういった技術を一つずつ積み上げていって、様々なコードを書けるようになったり読めるようになったりするのも、上達の楽しみだと思います。

ジェネレータとは

https://www.php.net/manual/ja/language.generators.overview.php
ジェネレータを使えば、シンプルな イテレータを簡単に実装できます。
foreach でデータ群を順に処理するコードを書くときに メモリ内で配列を組み立てなくても済むようになります。

構文

https://www.php.net/manual/ja/language.generators.syntax.php
ジェネレータ関数が呼ばれると、反復処理が可能なインスタンス(オブジェクト)を返します。このインスタンス(オブジェクト)は、内部クラス Generator のインスタンス(オブジェクト)になります。
このオブジェクトを (foreach ループなどで) 反復させると、 値が必要になるたびに PHP がオブジェクトの反復メソッドを呼びます。 そして、ジェネレータが値を yield した時点の状態を保存しておき、 次に値が必要になったときにはそこから再開できるようにします。

yield できる値がなくなると、ジェネレータは単純に終了します。 呼び出し元のコードでは、配列の要素をすべて処理し終えた後のように、そのまま処理が続きます。

ジェネレータは値を返す(returnする)ことができます。返した値は Generator::getReturn() で取得することが出来ます。

値とキーの yield

PHP は、数値添字の配列だけでなく連想配列にも対応しています。ジェネレータも例外ではありません。 先ほどの例のように単なる値を yield するだけでなく、 値と同時にキーも yield することができます。
連想配列のようではありますが連想配列ではないので、同じキーを何度も yield する事もできます。

参照による yield

ジェネレータ関数は、値を参照として yield することもできます。
関数内の変数の参照を yield する場合、外から関数内の変数への干渉が可能になります。

yield from によるジェネレータの委譲

ジェネレーターを委譲することで、 別のジェネレータや Traversable オブジェクトあるいは配列から、 yield from キーワードを使って値を yield できます。

このコラムに関連するコードはこちらになります
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/037.php

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

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