繁体   English   中英

Laravel Eloquent - 从子模型访问父模型返回子模型

[英]Laravel Eloquent - accessing parent model from child model returns child model

扩展Eloquent模型似乎是人们所做的事情 我有一个有趣的问题:

FooBase.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class FooBase extends Model {
     protected $table = 'foo_bar';
}

FooExtends.php

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM