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:
rewind
setzt den Zeiger auf den Anfang zurück.current
gibt den aktuellen Wert zurück.next
setzt den Zeiger um Einen nach vorn.key
gibt den aktuellen Index zurück.valid
prüft, ob nachrewind
odernext
noch 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