Heim >Backend-Entwicklung >PHP-Tutorial >Was ist Generator in PHP?

Was ist Generator in PHP?

巴扎黑
巴扎黑Original
2017-08-16 09:48:504797Durchsuche

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 in PHP?

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.');
Auf diese Weise wird das Programm gedruckt out

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 会被隐式调用。

Generator::throw()

这个方法,向生成器中,抛送一个异常。

后记

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn