Generator in PHP ist eine neue Funktion, die seit PHP5.5 hinzugefügt wurde und ins Chinesische als „Generator“ übersetzt wird; Generator bietet eine bequeme Möglichkeit, einen einfachen Iterator zu implementieren, ohne dass eine Klasse erstellt werden muss Erben Sie die Iterator-Schnittstelle.
Was ist Generator?
Ab PHP 5.5 war PHP hinzugefügt Eine neue Funktion ist Generator
, die ins Chinesische als 生成器
übersetzt wird.
Generator bietet eine bequeme Möglichkeit, einen einfachen Iterator zu implementieren. Wenn Sie Generator zum Implementieren von Iterator verwenden, müssen Sie keine Klasse erstellen, um die Iterator-Schnittstelle zu erben.
Generatoren können einfach zur Implementierung der Objektiteration verwendet werden. Beginnen wir mit einem kleinen offiziellen Beispiel.
xrange
In PHP wissen wir alle, dass es eine Funktion namens range
gibt, die zum Generieren eines Arrays arithmetischer Sequenzen verwendet wird, und dann können wir Verwenden Sie dies. Das Array wird über foreach
iteriert. Genau das möchte ich tun.
foreach (range(1, 100, 2) as $num) { echo "{$num}\n"; }
Dieser Code gibt das erste Element aus ist eine arithmetische Folge mit 1, dem letzten Term 100 und der Toleranz 2. Die Ausführungsreihenfolge ist wie folgt. Zuerst generiert range(1, 100, 2)
ein Array, das eine arithmetische Folge wie oben speichert, und iteriert dann dieses Array in foreach
.
Es stellt sich also die Frage: Was ist, wenn ich 1 Million Zahlen generieren möchte? Dann werden wir Hunderte Megabyte Speicher belegen. Obwohl Speicher jetzt sehr günstig ist, können wir Speicher nicht auf diese Weise verschwenden. Dann kann Ihnen unser Generator zu diesem Zeitpunkt nützlich sein. Betrachten Sie den folgenden Code.
function xrange($start, $limit, $step = 1) { yield $start; $start++; }foreach (xrange(1, 100, 2) as $num) { echo "{$num}\n"; }
Das Ergebnis dieses Codes, genau das Dasselbe wie der vorherige Codeabschnitt, aber seine internen Prinzipien werden auf den Kopf gestellt.
Wie wir gerade gesagt haben, generiert range
im vorherigen Code ein Array und foreach
iteriert dann das Array, um einen bestimmten Wert herauszunehmen. Aber in diesem Code haben wir eine xrange
-Funktion neu definiert und in der Funktion ein Schlüsselwort yield
verwendet. Wir alle wissen: Wenn Sie eine Funktion definieren und hoffen, dass sie einen Wert zurückgibt, verwenden Sie return
, um ihn zurückzugeben. Dieses yield
kann also auch einen Wert zurückgeben, ist aber völlig anders als return
.
Durch die Verwendung des Schlüsselworts yield
kann die Funktion während der Ausführung unterbrochen werden. Gleichzeitig wird der Kontext der gesamten Funktion gespeichert und ein Objekt vom Typ Generator
zurückgegeben. Wenn die next
-Methode des Objekts ausgeführt wird, wird der Kontext zum Zeitpunkt der Unterbrechung neu geladen und läuft weiter, bis das nächste yield
erscheint. Wenn später kein yield
erscheint, gilt der gesamte Generator als beendet.
Auf diese Weise kann unser obiger Funktionsaufruf äquivalent wie folgt geschrieben werden.
$nums = xrange(1, 100, 2);while ($nums->valid()) { echo $nums->current() . "\n"; $nums->next(); }
Hier ist $num
ein Generator
Objekt. Wir sehen hier drei Methoden: valid
, current
und next
. Wenn die Ausführung unserer Funktion abgeschlossen ist und es später keine yield
-Unterbrechung gibt, ist die Ausführung unserer Funktion in xrange
abgeschlossen, und die valid
-Methode wird zu false
. Was current
betrifft, so wird der Wert nach dem aktuellen yield
zurückgegeben. Dies bedeutet, dass die Generatorfunktion unterbrochen wird. Nach dem Aufruf der next
-Methode wird die Funktion dann weiter ausgeführt, bis das nächste yield
erscheint oder die Funktion endet.
Okay, hier sehen wir, dass yield
verwendet wird, um einen Wert zu „generieren“ und ihn zurückzugeben. Eigentlich kann yield
auch so geschrieben werden. Wie beim Rückgabewert wird hier beim weiteren Ausführen der Funktion ein Wert an die Funktion übergeben, der über $ret = yield;
verwendet werden kann. Zum Beispiel. Generator::send($value)
function sum(){ $ret = yield; echo "{$ret}\n"; } $sum = sum(); $sum->send('I am from outside.');
Die von der Methode übergebene Zeichenfolge. Es kann auf beiden Seiten von send
gleichzeitig Anrufe geben. yield
function xrange($start, $limit, $step = 1) { $ret = yield $start; $start++; echo "{$ret}\n"; }
而像这样的使用,send()
可以返回下一个 yield
的返回。
其它的 Generator 方法
Generator::key()
对于 yield
,我们可以这样使用 yield $id => $value
,这是,我们可以通过 key
方法来获取 $id
,而 current
方法返回的是 $value
。
Generator::rewind()
这个方法,可以帮我们让生成器重新开始执行并保存上下文,同时呢,会返回第一个 yield
返回的内容。在第一次执行 send
方法的时候,rewind
会被隐式调用。
这个方法,向生成器中,抛送一个异常。
后记
yield
作为 PHP 5.5 的新特性,让我们用了新的方法来高效地迭代数据。同时,我们还可以使用 yield
来实现协程。
更多相关知识,请访问 PHP中文网!!
Das obige ist der detaillierte Inhalt vonWas ist Generator in PHP?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!