Hauptmenü

Untermenü

OOP PHP5 - Techniken - Iteratoren

1. Das Problem

In PHP5 kann man mit foreach die Eigenschaften einer Klasse mit samt Ihren Werten auslesen. Dabei gibt es einen kleinen aber feinen Unterschied. Greift man außerhalb der Klasse zu, so werden nur die als public deklarierten Eigenschaften zurückgegeben, innerhalb der Klasse dagegen alle.


class MyClass
{
  public    $blubb       'blubber';
  public    $schwall     'laber';
  public    $jodelblah   'Hollahihü';
  protected $finger_wech 'geht dich nichts an';
  private   $nee_is_nich 'das hier auch nicht';
  
  public function iterateVisible()
  {
    foreach($this as $key => $value)
    {
      print $key.'-'.$value.'<br>';
    }
  }
}
$vars = new MyClass();
foreach ($vars as $key => $value)
{
  echo  $key.'-'.$value.'<br>';
}
echo '-----------------<br>';
$vars -> iterateVisible();

Leider hat man hier nur die Möglichkeit zwischen Allem oder Nichts. Was aber macht man, wenn man zum Beispiel den Zugriff nur auf ganz bestimmte Eigenschaften, zum Beispiel einem Array, zulassen möchte?

2. Die Lösung

In PHP5 ist bereits ein Interface namens Iterator eingebaut, mit dem man die Zugriffe steuert. Dazu benötigt man fünf Methoden:

Ein Beispiel

Kommen wir mal zu Dörte bzw. den Frauen im Allgemeinen zurück. Da gibt es vieles, was wir Männer brennend gerne in Erfahrung brächten. Was haben die in ihren Handtaschen oder was sind deren geheimste Träume. Jetzt sagt aber der Programmierer (besser die Programmiererin), dass uns die geheimsten Träume einen feuchten Kehricht angehen, ein Blick in die Handtasche aber erlaubt ist. Dafür benötigt man nur Folgendes.


class Frau implements Iterator
{
  private $handtascheninhalt = array(
                                      'a' => 'Lippenstift',
                                      'b' => 'Taschentücher',
                                      'c' => 'Pfefferspray'
                                    );
  private $geheime_traeume   = array('XXXXX','YYYYY','ZZZZZ');

  public function rewind()
  {
    reset ($this -> handtascheninhalt);
  }
  public function next()
  {
    return next($this -> handtascheninhalt);
  }
  public function current()
  {
    return current($this -> handtascheninhalt);
  }
  public function key()
  {
    return key ($this -> handtascheninhalt);
  }
  public function valid()
  {
    return $this -> current() !== false;
  }
}

$frau = new Frau;
foreach ($frau as $key => $value)
{
  echo $key.': '.$value.'<br>';
}

Hier wird tatsächlich nur der Inhalt der Handtasche preisgegeben und nicht die geheimsten Träume der Frauen. Eigentlich schade! Man kann das noch verfeinern, aber darauf gehe ich später in einen kommenden Tutorial ein.

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt