ジェネレータを説明する前に、イテレータを紹介しましょう。
PHP では、通常、次のように使用します。 foreach は配列を走査します。
オブジェクトを通過可能にしたい場合はどうすればよいでしょうか?
PHP には Iterator インターフェイスが用意されており、このインターフェイスが実装されている限り、このオブジェクトは foreach を通じて反復処理できます。
例は次のとおりです:
class myIterator implements Iterator { private $index = 0; private $data = ''; public function __construct($data) { $this->index = 0; $this->data = $data; } function rewind() { $this->index = 0; } function current() { return $this->data[$this->index]; } function key() { return $this->index; } function next() { ++$this->index; } function valid() { return isset($this->data[$this->index]); } } $it = new myIterator(array( "hello", "php", "iterator", )); foreach($it as $key => $value) { echo "$key : $value<br>"; }
foreach を介して $it をトラバースすると、PHP はそれ自体を順番に呼び出します:
rewind () リセット 最初の要素に移動
valid() 現在の位置が有効かどうかを確認します
current() 現在の要素を返します
key() 現在の要素のキーを返します
next()次の要素をポイントします
ジェネレーターは PHP 5.5 で導入された新機能ですが、現在使用している人はほとんどいないようです。
以下は、PHP 公式ドキュメントのジェネレーターの説明です。
ジェネレーターは、イテレーターを実装するクラスを定義する方法と比較して、単純なオブジェクトの反復を実装する簡単な方法を提供します。インターフェイスを使用すると、パフォーマンスのオーバーヘッドと複雑さが大幅に軽減されます。
ジェネレーターを使用すると、メモリ内に配列を作成せずに、foreach ブロックにコードを記述してデータ セットを反復処理できます。これにより、メモリ制限に達したり、かなりの処理時間がかかってしまいます。
代わりに、通常のカスタム関数と同様に、ジェネレーター関数を作成できます。一度だけ返される通常の関数とは異なり、ジェネレーターは、必要な回数だけ値を返すことができ、値が必要な反復を生成できます。
ジェネレーターの利点を反映するために、比較用の関数を定義しましょう:
function func1() { foreach (range(0, 1000000) as $value){ echo $value; } } func1(); // ( ! ) Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 402653192 bytes) in xxx.php on line 5
このような大きな配列は反復のためにメモリに作成されるため、PHP は制限を超えていることを直接プロンプトします。単一プロセスのメモリ制限。
ジェネレーター メソッドに切り替えましょう:
function func1() { foreach (range(0, 1000000) as $value){ yield $value; } } var_dump(func1()); // object(Generator)[1] foreach (func1() as $value){ echo $value; }
func1() を呼び出して Generator オブジェクトを返すことがわかります。このオブジェクトは foreach を使用して反復できます。各反復では、PHP Generator インスタンス反復する次の値を計算して提供するように求められます。
ジェネレーターの優雅さは、値が生成されるたびにジェネレーターの内部状態が一時停止するという事実に反映されており、
内部状態は次の値が生成されたときに復元されます。ジェネレーターからのリクエスト。ジェネレーターの内部状態は、関数定義本体の終わりに到達するか、空の return ステートメントに遭遇するまで、一時停止と再開の間で切り替わり続けます。
【推奨学習: PHP ビデオ チュートリアル 】