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 özellikleri yineledi.
Bir adım öteye giderek, Iterator arayüzü gerçeklenebilir. Iterator kullanılarak, hangi nesnenin nasıl yineleneceğine ve her yinelemede hangi değerlerin kullanılacağına 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()
{
$key = key($this->var);
$var = ($key !== NULL && $key !== 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 geçerli: 1 mevcut: 1 anahtar: 0 0: 1 sonraki: 2 geçerli: 1 mevcut: 2 anahtar: 1 1: 2 sonraki: 3 geçerli: 1 mevcut: 3 anahtar: 2 2: 3 sonraki: geçerli:
IteratorAggregate arayüzü, Iterator yöntemlerinin tümünü gerçeklemek için de kullanılabilir. IteratorAggregate sadece Iterator arayüzünü gerçekleyen sınıfın bir örneğini döndüren IteratorAggregate::getIterator() yönteminin gerçeklenmesini gerektirir.
Ö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.
Bilginize:
PHP 5.5 ve sonrası kullanıcıları, yineleyicileri tanımlamanın başka bir yolu olarak üreteçleri inceleyebilir.