2010-09-21 15 views
9

我見過這樣的事情在一個ORM:對象表現得像一個數組? (PHP)

$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 />'; 
    } 

怎麼可能一個對象同時充當數組和對象?我怎麼能做到這一點? 我希望在Book的父類中看到一個新的__magic方法或其他東西,但是我找不到任何東西,所以可能有一些關於php對象的基礎知識,我不知道。

有什麼想法?在此先感謝

回答

12

實現了Traversable接口(通過IteratorIteratorAggregate)對象支持foreach結構,如果這是你的意思是什麼「作爲一個數組。」例如:

class theClass implements Iterator { 
    // implement iterator here 
} 

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

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

愛是愛這個! :) – balupton 2010-09-21 05:56:51

+0

是的,這是我的恩,謝謝! – 2010-09-21 05:59:51

+6

實際上,每個對象都可以用foreach進行清理,但它將訪問所有公共屬性。如果你想改變這種行爲,你需要實現'Iterator'。您可能感興趣的另一個接口是ArrayAccess – Mchl 2010-09-21 06:18:53

5

你沒有做什麼特別的使用foreach使用對象。

PHP manual on Object Iteration

PHP 5條規定了定義對象,所以有可能通過項目列表進行迭代,用,例如foreach語句的方式。默認情況下,所有可見的屬性將用於迭代。

例子:

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

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

你的類沒有實現Traversable其他地方提出,事實上,該類上面沒有:

var_dump (new Foo instanceof Traversable); // FALSE 

可以實現一個的IteratorIteratorAggregate如果您需要更多的控制迭代應該如何表現:

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 

因爲IteratorIteratorAggregate延長Traversable,你的類將現在也成爲Traversable的實例,但像上面這樣表示,這是沒有必要去重複的對象。

var_dump (new Foo instanceof Traversable); // TRUE 

您也可以使用ArrayObject使物體的行爲像類和對象之間的混合。或者,您可以實施ArrayAccess以允許使用方括號訪問該類。您也可以將該類繼承爲PHP提供的one of the Iterators

延伸閱讀: