PHP Dokumentation: Language oop5 iterations
12. Januar 2010 von werner
Objektiteration
PHP 5 bietet eine Möglichkeit, Objekte so zu definieren, dass es möglich ist, eine Liste von Elementen zu durchlaufen, z.B. mit dem foreach Schlüsselwort. Standardmäßig werden alle sichtbaren Eigenschaften für die Iteration benutzt.
Beispiel #1 Einfache Objektiteration
<?php
class MyClass
{
public $var1 = 'Wert 1';
public $var2 = 'Wert 2';
public $var3 = 'Wert 3'; protected
$protected = 'protected var';
private $private = 'private var'; function
iterateVisible() {
echo "MyClass::iterateVisible:\n";
foreach($this as $key => $value) {
print "$key => $value\n";
}
}
}$class = new MyClass();foreach(
$class as $key => $value) {
print "$key => $value\n";
}
echo "\n";$class->iterateVisible();?>Das oben gezeigte Beispiel erzeugt folgendeAusgabe:
var1 => Wert 1var2 => Wert 2var3 => Wert 3MyClass::iterateVisible:var1 => Wert 1var2 => Wert 2var3 => Wert 3protected => protected varprivate => private var
Wie die Ausgabe zeigt, lief das foreach über alle sichtbaren Variablen, auf die zugegriffen werden kann. Um es einen Schritt weiter zu treiben, kann man eines der PHP 5 internen Interfaces, nämlich Iterator, implementieren. Das erlaubt dem Objekt zu entscheiden was und wie das Objekt iteriert wird.
Beispiel #2 Objektiteration mit implementiertem Iterator
<?php
class MyIterator implements Iterator
{
private $var = array(); public function
__construct($array)
{
if (is_array($array)) {
$this->var = $array;
}
} public function
rewind() {
echo "zurückspulen\n";
reset($this->var);
} public function
current() {
$var = current($this->var);
echo "aktuell: $var\n";
return $var;
} public function
key() {
$var = key($this->var);
echo "key: $var\n";
return $var;
} public function
next() {
$var = next($this->var);
echo "nächstes: $var\n";
return $var;
} public function
valid() {
$var = $this->current() !== false;
echo "gültig: {$var}\n";
return $var;
}
}$values = array(1,2,3);
$it = new MyIterator($values);foreach (
$it as $a => $b) {
print "$a: $b\n";
}
?>Das oben gezeigte Beispiel erzeugt folgendeAusgabe:
zurückspulenaktuell: 1gültig: 1aktuell: 1key: 00: 1nächstes: 2aktuell: 2gültig: 1aktuell: 2key: 11: 2nächstes: 3aktuell: 3gültig: 1aktuell: 3key: 22: 3nächstes:aktuell:gültig:
Man kann eine Klasse ebenfalls so definieren, dass diese nicht alle Funktionen von Iterator definieren muss, indem man einfach das PHP 5 IteratorAggregate Interface implementiert.
Beispiel #3 Objektiteration mit implementiertem IteratorAggregate
<?php
class MyCollection implements IteratorAggregate
{
private $items = array();
private $count = 0;
// benötigte Funktion des IteratorAggregate Interface
public function getIterator() {
return new MyIterator($this->items);
} public function
add($value) {
$this->items[$this->count++] = $value;
}
}$coll = new MyCollection();
$coll->add('Wert 1');
$coll->add('Wert 2');
$coll->add('Wert 3');foreach (
$coll as $key => $val) {
echo "key/value: [$key -> $val]\n\n";
}
?>Das oben gezeigte Beispiel erzeugt folgendeAusgabe:
zurückspulenaktuell: Wert 1gültig: 1aktuell: Wert 1key: 0key/value: [0 -> Wert 1]nächstes: Wert 2aktuell: Wert 2gültig: 1aktuell: Wert 2key: 1key/value: [1 -> Wert 2]nächstes: Wert 3aktuell: Wert 3gültig: 1aktuell: Wert 3key: 2key/value: [2 -> Wert 3]nächstes:aktuell:gültig:
Hinweis: Für mehr Beispiele für die Benutzung von Iteratoren siehe auch SPL Erweiterung.