V. 8.7 (27.03.2012)

Infos

Download

Theorie OOP PHP5

Beispiele

Beispiele

Schnellsuche

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 der Frauen. Eigentlich schade! Man kann das noch verfeinern, aber darauf gehe ich später in einen kommenden Tutorial ein.

weiter zum nächsten Abschnitt