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接口的对象(通过Iterator或IteratorAggregate)支持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对对象使用任何特殊操作.
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)
因为Iterator和IteratorAggregate扩展Traversable,你的类现在也将是一个实例Traversable,但如上所示,它不需要迭代对象.
var_dump (new Foo instanceof Traversable); // TRUE
Run Code Online (Sandbox Code Playgroud)
您还可以使用ArrayObject使对象的行为类似于类和对象之间的混合.或者,您可以实现ArrayAccess以允许使用方括号访问类.您还可以将该类子类化为 PHP提供的迭代器之一.
进一步阅读: