PHP 5 ile tanımlanan nesneler, foreach gibi bir deyim kullanılarak bir öğe listesi üzerinden yinelenebilirler. Öntanımlı olarak, tüm görünür özellikler yineleme için kullanılacaktır.
Örnek 1 - Basit Nesne Yineleme
<?php
class MyClass
{
public $var1 = 'değer 1';
public $var2 = 'değer 2';
public $var3 = 'değer 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();
?>
Yukarıdaki örneğin çıktısı:
var1 => değer 1 var2 => değer 2 var3 => değer 3 MyClass::iterateVisible: var1 => değer 1 var2 => değer 2 var3 => değer 3 protected => protected var private => private var
Çıktıdan görüleceği gibi, foreach erişilebilir olan tüm görünür değişkenleri yineledi. Bir adım öteye giderek, PHP'nin yerleşik arayüzlerinden biri olan Iterator'ü gerçekleyebilirsiniz. Iterator kullanılarak, hangi nesnenin nasıl yineleneceğine bir nesnenin karar verebilmesi mümkündür.
Örnek 2 - Iterator kullanılarak Nesne Yineleme
<?php
class MyIterator implements Iterator
{
private $var = array();
public function __construct($array)
{
if (is_array($array)) {
$this->var = $array;
}
}
public function rewind() {
echo "başa al\n";
reset($this->var);
}
public function current() {
$var = current($this->var);
echo "mevcut: $var\n";
return $var;
}
public function key() {
$var = key($this->var);
echo "anahtar: $var\n";
return $var;
}
public function next() {
$var = next($this->var);
echo "sonraki: $var\n";
return $var;
}
public function valid() {
$var = $this->current() !== false;
echo "geçerli: {$var}\n";
return $var;
}
}
$values = array(1,2,3);
$it = new MyIterator($values);
foreach ($it as $a => $b) {
print "$a: $b\n";
}
?>
Yukarıdaki örneğin çıktısı:
başa al mevcut: 1 geçerli: 1 mevcut: 1 anahtar: 0 0: 1 sonraki: 2 mevcut: 2 geçerli: 1 mevcut: 2 anahtar: 1 1: 2 sonraki: 3 mevcut: 3 geçerli: 1 mevcut: 3 anahtar: 2 2: 3 sonraki: mevcut: geçerli:
Ayrıca, kendi sınıfınızı, Iterator işlevlerinin tümünü her defasında yeniden tanımlamadan, PHP 5 ile birlikte gelen IteratorAggregate arayüzünü gerçekleyerek tanımlayabilirsiniz.
Örnek 3 - IteratorAggregate ile Nesne Yineleme
<?php
class MyCollection implements IteratorAggregate
{
private $items = array();
private $count = 0;
// IteratorAggregate için gerekli arayüz tanımı
public function getIterator() {
return new MyIterator($this->items);
}
public function add($value) {
$this->items[$this->count++] = $value;
}
}
$coll = new MyCollection();
$coll->add('değer 1');
$coll->add('değer 2');
$coll->add('değer 3');
foreach ($coll as $key => $val) {
echo "key/value: [$key -> $val]\n\n";
}
?>
Yukarıdaki örneğin çıktısı:
başa al mevcut: değer 1 geçerli: 1 mevcut: değer 1 anahtar: 0 anahtar/değer: [0 -> değer 1] sonraki: değer 2 mevcut: değer 2 geçerli: 1 mevcut: değer 2 anahtar: 1 anahtar/değer: [1 -> değer 2] sonraki: değer 3 mevcut: değer 3 geçerli: 1 mevcut: değer 3 anahtar: 2 anahtar/değer: [2 -> değer 3] sonraki: mevcut: geçerli:
Bilginize:
Yineleyiciler ile ilgili daha fazla örnek için, Iterators bölümüne bakınız.