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

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


文件库

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


摇曳的蔷薇
浏览 112回答 1
1回答

白猪掌柜的

基本上,对“静态”调用的FooBase::first()解释与 相同parent::first(),因为 PHP 知道这FooBase是当前类上下文的父级FooExtends。并且由于调用parent保持在当前对象的上下文中,因此first()调用最终会被路由到__call()而不被路由__callStatic()(这将使用FooBase该类创建一个新的上下文)。学习 PHP 内部和类上下文真的很有趣。谢谢你给我一个四处闲逛的理由。:)
打开App,查看更多内容
随时随地看视频慕课网APP