php - Laravel Eloquent - 从子模型访问父模型返回子模型
问题描述
扩展 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
是当前类 context 的父级FooExtends
。并且由于调用parent
保持在当前对象的上下文中,first()
调用最终被路由到__call()
而不是(这将使用该类__callStatic()
创建一个新的上下文)。FooBase
了解 PHP 内部结构和类上下文真的很有趣。谢谢你给了我一个闲逛的理由。:)
推荐阅读
- javascript - 带有打字效果的Javascript文本冒险
- python - 如何在 Tkinter 的文本字段中制作可清除的文本?
- python - 运行 Python 脚本的关键错误(使用 Atom)
- cookies - 如何在 GitHub Actions 中使用 cookie/身份验证运行测试?
- ubuntu - 无法建立与 http://controller:9696/v2.0/networks 的连接
- javascript - 我的查询选择器没有捕获所有 DOM 元素
- google-apps-script - 如何在 getSheetByName 中使用变量作为参数?
- django - DRF 中的动作装饰器不适用于 url_path
- python - 如何在 Python 中为协变可变集合类类使用类型提示?
- optaplanner - 使用时间链模式,为什么下一个任务的值总是为空?