Der Iterator – Teil 2
Ein neuer Tag ein neuer Eintrag. Wie ich gestern ja bereits geschrieben habe, werde ich heute ein wenig auf die technischen Details des Iterators eingehen. Eigentlich ist es ganz einfach. Ich habe ein Objekt und implementiere es gegen folgendes Interface:
<?php
Interface Iterator
{
public function rewind();
public function valid();
public function key();
public function current();
public function next();
}
?>
Die meisten der Methoden sind meiner Meinung nach selbsterklärend, aber wie ich nun mal bin, werde ich es trotzdem machen. Fangen wir also von oben an. Rewind
. Diese Methode setzt die ganze Liste wieder auf ihren Anfangswert zurück. Valid
prüft ob der aktuelle Eintrag auch gültig ist. Jeder Eintrag in der Liste hat einen eindeutigen Schlüssel, dies kennt man ja bereits vom guten alten Array. Current
gibt das aktuelle Element zurück und Next
kümmert sich um das Iterieren. Eigentlich sind wir jetzt auch schon am Ziel. Bei der richtigen Verwendung kann man mit diesem fünf Methoden schon wahre Wunder bewirken. Wer einen einfachen Einstieg in diese Thematik will, der soll doch einfach mal probieren den Standard Array zu implementieren. Besser gesagt einen Array Wrapper basteln, denn ganz ohne Array wird es nicht klappen.Spielt man eine einfache foreach ( $iterator as $key => $value)
Schleife durch, dann werden folgende Schritte durchgeführt:
Rewind
wird aufgerufen auf den Iterator zurückzusetzen- Prüfen ob das aktuelle Element gültig ist, falls nicht, dann Schleife beenden
- $key wird mir dem Rückgabewert der
key
Funktion gefüllt und $value mit dem Wert voncurrent
- Die next Methode wird aufgerufen, um auf das nächste Element zu springen
- Springe zu Schritt 2
Gestern habe ich aber versprochen, dann ich mich doch noch ein wenig auslassen will über die Schwächen und andere Dinge. Schwächen ist vielleicht übertrieben es gibt eigentlich nur eine Kleinigkeit die mich stört. Und zwar würde ich nicht die Funktion valid
implementieren, sondern eine hasNext
. Diese würde immer vor dem Iterieren aufgerufen werden und nicht danach. Was für einen Sinn macht es denn das nächste Element zu fokusieren, wenn es kein nächstes Element gibt. Ich wills ja nicht schon wieder sagen, aber Java hat da meiner Meinung nach den besseren Weg gewählt und wirklich eine hasNext
Methode bereitgestellt. Aber vielleicht gibt es ja auch hier einen Grund, den ich einfach nur nicht verstehe.
Fazit: Trotz des kleinen Schnitzers, den sich die PHP Jungs hier erlaubt haben. möchte ich doch trotzdem jedem dieses Interface ans Herz legen. Es ist auf jeden Fall ein Schritt in die richtige Richtung und die SPL kann noch eine Menge solcher Ideen gebrauchen.