当我们使用artisan tinker
, 并引用一个 Eloquent 模型对象时,REPL 会自动打印模型的属性,就像它打印我们引用的任何标准对象的公共属性一样:
>>> (object) ['hello' => 'world']
=> {
+"hello": "world",
}
>>> App\User::first()
=> App\User {
id: 1,
name: "...",
}
对我来说不太明显的是如何使这些虚拟属性出现在这里,就好像它们已经被定义为类的公共属性一样。我知道模型的大部分属性分配都是由HasAttributes
trait 在内部处理的,但是即使看那里,我仍然看不到 Laravel 的作者是如何实现这种行为的。
我试过建立一个这样的类:
class Bunch implements Arrayable, ArrayAccess, Jsonable, JsonSerializable { ... }
但即使使用有效的数组访问和toArray
方法,当我直接从以下位置引用它时artisan tinker
:
>>> $b = new Bunch()
=> Bunch {}
>>> $b->one = 1
=> 1
>>> $b['one']
=> 1
>>> $b
=> Bunch {}
我们如何改变 REPL 在打印这样的对象时使用的表示?