Facebook
Twitter
Google+
Kommentare
0

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:

  1. Rewind wird aufgerufen auf den Iterator zurückzusetzen
  2. Prüfen ob das aktuelle Element gültig ist, falls nicht, dann Schleife beenden
  3. $key wird mir dem Rückgabewert der key Funktion gefüllt und $value mit dem Wert von current
  4. Die next Methode wird aufgerufen, um auf das nächste Element zu springen
  5. 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.

Über den Autor

Nils Langner

Nils Langner ist der Gründer von "the web hates me" und auch der Hauptautor. Im wahren Leben leitet er das Qualitätsmanagementteam im Gruner+Jahr-Digitalbereich und ist somit für Seiten wie stern.de, eltern.de und gala.de aus Qualitätssicht verantwortlich. Nils schreibt seit den Anfängen von phphatesme, welches er ebenfalls gegründet hat, nicht nur für diverse Blogs, sondern auch für Fachmagazine, wie das PHP Magazin, die t3n, die c't oder die iX. Nebenbei ist er noch ein gern gesehener Sprecher auf Konferenzen. Herr Langner schreibt die Texte über sich gerne in der dritten Form.
Kommentare

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen