2010-09-21 12 views
9

(PHP):Nesne bir dizi gibi davranıyor? Ben bir ORM böyle bir şey gördük

$b = new Book(); 
    $b->limit(5)->get(); 

    echo 'ID: ' . $b->id . '<br />'; 
    echo 'Name: ' . $b->title . '<br />'; 
    echo 'Description: ' . $b->description . '<br />'; 
    echo 'Year: ' . $b->year . '<br />'; 

    foreach ($b as $book) 
    { 
     echo 'ID: ' . $book->id . '<br />'; 
     echo 'Name: ' . $book->title . '<br />'; 
     echo 'Description: ' . $book->description . '<br />'; 
     echo 'Year: ' . $book->year . '<br />'; 
     echo '<br />'; 
    } 

Nasıl bir nesne dizisi ve nesne gibi davranır mümkün olabilir? Bunu nasıl başarabilirim? Kitabın ana sınıfında yeni bir __magic yöntemi veya bir şey görmeyi umuyordum, ama hiçbir şey bulamadım, bu yüzden bilmediğim php nesneleriyle ilgili temel bir şey olabilir.

Herhangi bir düşünce? O size demek buysa Şimdiden teşekkürler

cevap

12

(Iterator veya IteratorAggregate aracılığıyla) Traversable arabirimini uygulamak nesneler, foreach yapısını desteklemek "bir dizi olarak hareket etmektir". Ör:

class theClass implements Iterator { 
    // implement iterator here 
} 

// now you can do 
$obj = new theClass; 

foreach ($obj as $value) { 
    // do something 
} 
+1

Gotta bu aşk! :) – balupton

+0

evet, öyle söylüyorum, teşekkürler! –

+6

Aslında her nesne foreach ile taranabilir, ancak tüm kamu özelliklerine erişir.Bu davranışı değiştirmek istiyorsanız 'Yineleyici'yi uygulamanız gerekir. İlgilendiğiniz başka bir arayüz 'ArrayAccess' – Mchl

5

Sen nesnelerle foreach kullanmak için özel bir şey yapmak zorunda değilsiniz. PHP manual on Object Iteration itibaren

:

PHP 5 o öğelerin bir listesi üzerinden yineleme mümkün yani nesneler, örneğin ile, bir foreach ifadesi tanımlanmasına yönelik bir yol sağlar. Varsayılan olarak, tüm görünür özellikler yineleme için kullanılacaktır.

Örnek:

class Foo 
{ 
    public $foo = 1; 
    protected $bar = 2; 
    private $baz = 3; 
} 

foreach(new Foo as $prop) echo $prop; // outputs 1 only 

başka yerde önerilen ve aslında, sınıf yukarıda değil Olarak sınıf Traversable uygulamak zorunda değildir:

var_dump (new Foo instanceof Traversable); // FALSE 

Sen birini uygulayabilirsiniz yinelemenin nasıl davranması gerektiğine dair daha fazla kontrole ihtiyacınız varsa, Iterator veya IteratorAggregate'dan yararlanın:

ve IteratorAggregate Traversable uzatmak
class Foo implements IteratorAggregate 
{ 
    public $foo = 1; 
    protected $bar = 2; 
    private $baz = 3; 

    public function getIterator() 
    { 
     return new ArrayIterator((array) $this); 
    } 
} 

foreach(new Foo as $prop) echo $prop; // outputs 123 

olduğundan, sınıf şimdi de Traversable bir örneği olur ama gibi nesne yineleme için gerekli değil, yukarıda gösterilen.

var_dump (new Foo instanceof Traversable); // TRUE 

Ayrıca nesne sınıfı ve nesne arasındaki bir melez benzemesi için bir ArrayObject kullanabilirsiniz. Veya sınıfa köşeli ayraçlarla erişime izin vermek için ArrayAccess uygulayabilirsiniz. Ayrıca sınıfın one of the Iterators PHP sağladığı alt sınıfı da yapabilirsiniz.

fazla okuma:

İlgili konular