PHP 5 bietet eine Möglichkeit, Objekte so zu definieren, dass sie durch eine Liste von Zellen durchlaufen werden können, beispielsweise mithilfe der foreach-Anweisung. Standardmäßig werden alle sichtbaren Eigenschaften für die Durchquerung verwendet.
Beispiel #1 Einfache Objektdurchquerung
class MyClass { public $var1 = 1; public $var2 = 2; public $var3 = 3; protected $protected = 'protected var'; private $private = 'private var'; function iterateVisible(){ echo "MyClass::iterateVisible:<br>"; foreach($this as $key => $value){ print "$key=>$value<br>"; } } } $class = new MyClass(); foreach($class as $key => $value){ print "$key => $value<br>"; } echo "<br>"; $class->iterateVisible();
Ausgabeergebnis:
var1 => 1
var2 => 2
var3 => 3
MyClass::iterateVisible:
var1=>1
var2=>2
var3=> ; 3
protected=>protected var
private=>private var
Wie oben gezeigt, durchläuft foreach alle sichtbaren Eigenschaften, auf die es zugreifen kann.
Gehen Sie weiter und implementieren Sie die Iterator-Schnittstelle. Sie können das Objekt bei jedem Durchlaufen entscheiden lassen, wie es durchlaufen wird und welche Werte verfügbar sind.
class MyIterator implements Iterator{ private $var = array(); public function __construct($array) { if(is_array($array)){ $this->var = $array; } } public function rewind(){ echo "rewinding<br>"; reset($this->var); } public function current(){ $var = current($this->var); echo "current:$var<br>"; return $var; } public function key(){ $var = key($this->var); echo "key:$var<br>"; return $var; } public function next(){ $var = next($this->var); echo "next:$var<br>"; return $var; } public function valid(){ $var = $this->current()!==false; echo "valid:$var<br>"; return $var; } } $values = array(1,2,3); $it = new MyIterator($values); foreach($it as $a => $b){ print "$a:$b<br>"; }
Ausgabeergebnis:
Zurückspulen
aktuell:1
gültig:1
aktuell:1
Schlüssel:0
0:1
nächster:2
aktuell:2
gültig:1
aktuell:2
Schlüssel:1
1:2
nächster:3
aktuell:3
gültig:1
aktuell:3
Schlüssel:2
2:3
nächster:
aktuell:
gültig:
Sie können die IteratorAggregate-Schnittstelle verwenden, anstatt alle Iterator-Methoden zu implementieren. IteratorAggregate muss nur eine Methode implementieren, IteratorAggregate::getIterator(), die eine Instanz der Klasse zurückgeben soll, die Iterator implementiert.
Beispiel #3 Durchlaufen von Objekten durch Implementierung von IteratorAggregate
include_once('class2.php'); class MyCollection implements IteratorAggregate { private $items = array(); private $count = 0; public function getIterator(){ return new MyIterator($this->items); } public function add($value){ $this->items[$this->count++] = $value; } } $coll = new MyCollection(); $coll -> add('1'); $coll -> add('2'); $coll -> add('3'); foreach($coll as $k => $v){ echo "key/value:[$k->$v]<br><br>"; }
Ausgabeergebnis:
Zurückspulen
aktuell:1
gültig: 1
aktuell:1
Schlüssel:0
Schlüssel/Wert:[0->1]
nächster: 2
aktuell:2
gültig:1
aktuell:2
Schlüssel:1
Schlüssel/Wert:[1 - >2]
nächste:3
aktuelle:3
gültig:1
aktuelle:3
Schlüssel:2
Schlüssel/Wert:[2->3]
nächster:
aktuell:
gültig: