扩展 Eloquent 模型似乎是人们所做的事情。我有一个有趣的问题:文件库namespace App\Models;use Illuminate\Database\Eloquent\Model;class FooBase extends Model { protected $table = 'foo_bar';}FooExtends.phpnamespace App\Models;class FooExtends extends FooBase { public function method() { return FooBase::first(); // or even parent::first() }}调用(new FooExtends())->method()返回一个FooExtends而不是的实例FooBase。(只是静态方法受到影响,这可能会回答我自己的问题,但有人会认为 Laravel 会处理这个问题。(new FooBase())->first()从子类内部调用是有效的。)这里发生了什么?PHP 7.3,Laravel 5.7
1 回答
白猪掌柜的
TA贡献1893条经验 获得超10个赞
基本上,对“静态”调用的FooBase::first()
解释与 相同parent::first()
,因为 PHP 知道这FooBase
是当前类上下文的父级FooExtends
。并且由于调用parent
保持在当前对象的上下文中,因此first()
调用最终会被路由到__call()
而不被路由__callStatic()
(这将使用FooBase
该类创建一个新的上下文)。
学习 PHP 内部和类上下文真的很有趣。谢谢你给我一个四处闲逛的理由。:)
- 1 回答
- 0 关注
- 111 浏览
添加回答
举报
0/150
提交
取消