[英]Laravel Eloquent - accessing parent model from child model returns child model
扩展Eloquent模型似乎是人们所做的事情 。 我有一个有趣的问题:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class FooBase extends Model {
protected $table = 'foo_bar';
}
namespace 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
这是一个非常有趣的PHP怪癖, 它在调用祖先类时不应用静态上下文 。
基本上,“静态”调用FooBase::first()
得到解释一样parent::first()
因为PHP知道FooBase
是当前类上下文的父FooExtends
。 由于对parent
对象的调用保留在当前对象的上下文中,因此first()
调用最终被路由到__call()
而不是__callStatic()
(这将使用FooBase
类创建新的上下文)。
学习PHP内部和类上下文真的很有趣。 谢谢你给我一个理由四处寻找。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.