Bevor wir den Generator erklären, stellen wir uns den Iterator vor:
In PHP verwenden Sie normalerweise foreach, um ein Array zu durchlaufen.
Was wäre, wenn wir ein Objekt passierbar machen wollen?
PHP stellt uns die Iterator-Schnittstelle zur Verfügung. Solange diese Schnittstelle implementiert ist, kann dieses Objekt über foreach iteriert werden.
Das Beispiel ist wie folgt:
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>"; }
Wenn wir $it durch foreach durchlaufen, ruft sich PHP nacheinander auf:
rewind() Auf das erste Element zurücksetzen
valid() Überprüfen Sie, ob die aktuelle Position gültig ist
current() Gibt das aktuelle Element zurück
key() Gibt den Schlüssel des aktuellen Elements zurück
next() Zeigt auf das nächste Element
Der Generator ist eine neue Funktion, die in PHP 5.5 eingeführt wurde, aber nur wenige Leute scheinen sie zu verwenden gegenwärtig.
Das Folgende ist eine Erklärung des Generators in der offiziellen PHP-Dokumentation:
Der Generator bietet eine einfachere Möglichkeit, eine einfache Objektiteration zu implementieren. Im Vergleich zur Definition einer Klasse zur Implementierung der Iterator-Schnittstelle sind der Leistungsaufwand und die Komplexität geringer stark reduziert.
Mit Generatoren können Sie Code in einen foreach-Block schreiben, um einen Datensatz zu durchlaufen, ohne ein Array im Speicher zu erstellen, was Ihre Speichergrenze erreichen oder erhebliche Verarbeitungszeit in Anspruch nehmen würde.
Stattdessen können Sie eine Generatorfunktion wie eine normale benutzerdefinierte Funktion schreiben. Im Gegensatz zu einer normalen Funktion, die nur einmal zurückgibt, kann ein Generator so oft wie nötig nachgeben, um Werte zu generieren, die iteriert werden müssen.
Um die Vorteile des Generators darzustellen, definieren wir eine Funktion zum Vergleich:
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
Da ein so großes Array erstellt und in den Speicher iteriert wird, meldet PHP direkt, dass das Speicherlimit eines einzelnen Prozesses überschritten wird.
Jetzt verwenden wir einen Generator, um damit umzugehen:
function func1() { foreach (range(0, 1000000) as $value){ yield $value; } } var_dump(func1()); // object(Generator)[1] foreach (func1() as $value){ echo $value; }
Sie können sehen, dass wir func1() aufgerufen und ein Generatorobjekt zurückgegeben haben, das mit foreach iteriert werden kann. Für jede Iteration fordert PHP die Generatorinstanz auf, zu berechnen und Geben Sie den folgenden A-Wert für die Iteration an.
Die Eleganz des Generators spiegelt sich darin wider, dass der interne Zustand des Generators jedes Mal angehalten wird, wenn ein Wert erzeugt wird.
Der interne Zustand wird wiederhergestellt, wenn der nächste Wert vom Generator angefordert wird. Der interne Zustand des Generators wechselt zwischen Pause und Fortsetzen, bis das Ende der Funktionsdefinition erreicht ist oder eine leere Return-Anweisung gefunden wird.
【Empfohlenes Lernen: PHP-Video-Tutorial】