Nesne Yineleme

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.