PHPジェネレーターとイテレーターオブジェクト
はじめに
ジェネレーター関数が呼び出されると、内部的に、ジェネレータークラスの新しいオブジェクトが返されます。 イテレータを実装します インターフェース。イテレータインターフェイスは、次の抽象メソッドを定義します
- Iterator ::current —現在の要素を返します
- Iterator ::key —現在の要素のキーを返します
- イテレータ::次へ —次の要素に進みます
- イテレータ::巻き戻し —イテレータを最初の要素に巻き戻します
- イテレータ::有効 —現在の位置が有効かどうかを確認します
ジェネレータはフォワードのみのイテレータとして機能します オブジェクトは、ジェネレータへの値の送信やジェネレータからの値の戻りなど、ジェネレータの状態を操作するために呼び出すことができるメソッドを提供します。
インターレーターとしてのジェネレーター
次の例では、ジェネレーター関数は、oreachループを使用してトラバースできるジェネレーターオブジェクト内のファイルに行を生成します。 現在などのイテレータメソッド ()と次へ ()を呼び出すこともできます。ただし、ジェネレータは順方向のみのイテレータであるため、巻き戻しを呼び出します ()メソッドは例外をスローします
例
<?php
function filegenerator($name) {
$fileHandle = fopen($name, 'r');
while ($line = fgets($fileHandle)) {
yield $line;
}
fclose($fileHandle);
}
$name="test.txt";
$file=filegenerator($name);
foreach ($file as $line)
echo $line;
$file->rewind();
echo $file->current();
$file->next();
echo $file->current();
?> 出力
ファイル行をトラバースした後、以下に示すような致命的なエラーが表示されます
PHP User Defined Functions PHP Function Arguments PHP Variable Functions PHP Internal (Built-in) Functions PHP Anonymous functions PHP Arrow Functions PHP Fatal error: Uncaught Exception: Cannot rewind a generator that was already run
-
PHPで匿名オブジェクトを作成する
PHPバージョン7から、匿名クラスの作成が可能になりました。 PHPのすべてのオブジェクトは、クラスに関連付けられています。匿名クラスをインスタンス化してオブジェクトを作成できます。 例 <?php class my_sample_class {} $obj = new class extends my_sample_class {}; echo "Does the instance belong to parent class? = " ; echo var_du
-
Pythonのジェネレーター?
ジェネレーターは、PEP 255で導入されて以来、Pythonの重要な部分となっています。 Pythonのジェネレーターは、ループの反復動作を制御するために使用できる特別なルーチンです。ジェネレータは、配列を返す関数に似ています。ジェネレーターにはパラメーターがあり、これを呼び出すことができ、一連の数値を生成します。ただし、配列全体を返す関数とは異なり、ジェネレーターは一度に1つの値を生成するため、必要なメモリは少なくなります。 キーワード「yield」を持つPython関数は、ジェネレーターと呼ばれることがあります。通常のPython関数は、最初の行から実行を開始し、returnステート