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:
rewindsetzt den Zeiger auf den Anfang zurück.currentgibt den aktuellen Wert zurück.nextsetzt den Zeiger um Einen nach vorn.keygibt den aktuellen Index zurück.validprüft, ob nachrewindodernextnoch ein Element da ist.
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