对象就像一个数组?(PHP)

Ano*_*oob 9 php arrays orm object

我在ORM中看到过类似的东西:

    $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 />';
    }
Run Code Online (Sandbox Code Playgroud)

一个对象如何同时充当数组和对象?我怎么能做到这一点?我希望在Book的父类中看到一个新的__magic方法或者什么,但我找不到任何东西,所以可能有一些关于我不知道的php对象的基本内容.

有什么想法吗?提前致谢

Nul*_*ion 12

实现Traversable接口的对象(通过IteratorIteratorAggregate)支持foreach构造,如果这是"充当数组"的意思.例如:

class theClass implements Iterator {
    // implement iterator here
}

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

foreach ($obj as $value) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上每个对象都可以与foreach一起被攻击,但它将访问所有公共属性.如果要更改此行为,则需要实现`Iterator`.您可能感兴趣的另一个接口是"ArrayAccess" (6认同)

Gor*_*don 6

您不必foreach对对象使用任何特殊操作.

对象迭代PHP手册:

PHP 5提供了一种定义对象的方法,因此可以使用例如foreach语句迭代项目列表.默认情况下,所有可见属性都将用于迭代.

例:

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

foreach(new Foo as $prop) echo $prop; // outputs 1 only
Run Code Online (Sandbox Code Playgroud)

您的课程不必Traversable按照其他地方的建议实施,事实上,上述课程不会:

var_dump (new Foo instanceof Traversable); // FALSE
Run Code Online (Sandbox Code Playgroud)

可以实现一个迭代器IteratorAggregate,如果您需要在迭代该如何做更多的控制权:

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
Run Code Online (Sandbox Code Playgroud)

因为IteratorIteratorAggregate扩展Traversable,你的类现在也将是一个实例Traversable,但如上所示,它不需要迭代对象.

var_dump (new Foo instanceof Traversable); // TRUE
Run Code Online (Sandbox Code Playgroud)

您还可以使用ArrayObject使对象的行为类似于类和对象之间的混合.或者,您可以实现ArrayAccess以允许使用方括号访问类.您还可以将该类子类化为 PHP提供的迭代器之一.

进一步阅读: