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

时间:2019-07-20 18:30:18

标签: php laravel

扩展口才模型似乎是thing人所做的。我有一个有趣的问题:

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

1 个答案:

答案 0 :(得分:1)

这是doesn't apply static context when calling an ancestor class的一个非常有趣的PHP怪癖。

基本上,对FooBase::first()的“静态”调用的解释与parent::first()相同,因为PHP知道FooBase是当前类上下文FooExtends的父级。并且由于对parent的调用保留在当前对象的上下文中,因此first()调用最终被路由到__call()而不是__callStatic()(这将使用FooBase类)。

了解PHP内部和类上下文真的很有趣。谢谢你给我一个理由。 :)