Beispiele zur Erläuterung von Iterator und Generator in PHP

藏色散人
Freigeben: 2023-04-10 11:58:02
nach vorne
2397 Leute haben es durchsucht

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>";
}
Nach dem Login kopieren

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
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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

Das obige ist der detaillierte Inhalt vonBeispiele zur Erläuterung von Iterator und Generator in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage