当我们使用artisan tinker, 并引用 Eloquent 模型对象时,REPL 会自动打印模型的属性,就像它打印我们引用的任何标准对象的公共属性一样:
>>> (object) ['hello' => 'world']
=> {
+"hello": "world",
}
>>> App\User::first()
=> App\User {
id: 1,
name: "...",
}
对我来说不太明显的是如何使这些虚拟属性出现在这里,就好像它们已经被定义为类的公共属性一样。我知道模型的大部分属性分配都是由该HasAttributes特征在内部处理的,但即使查看那里,我仍然不明白 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 打印这样的对象时,我们如何更改它使用的表示形式?
牛魔王的故事
慕容3067478