Laravel不能使用Model::getTable()

博客探讨了在Laravel中尝试静态调用Model::getTable()时遇到的错误。错误信息提示非静态方法不应静态调用。作者发现Model::where()可以正常工作,但::getTable()不行。进一步研究发现,PHP在检查方法是否存在时不考虑方法是否为静态或大小写,导致这种现象。解决方案在于理解PHP的调用范围(Calling Scope)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前理解,调用Model::getTable()的时候,Model里面并没有getTable的静态方法,
会去调用__callStatic(),来看一下代码:

public static function __callStatic($method, $parameters)
{
    $instance = new static;

    return call_user_func_array([$instance, $method], $parameters);
}

在代码中new了一个实例对象,通过call_user_func_array方法去调用getTable。
看起来没毛病,结构却是残酷的提示:

Non-static method Illuminate\Database\Eloquent\Model::getTable() should not be called statically, assuming $this from incompatible context

那为什Model::where()没问题了呢?


于是在__callStatic方法内部打印出一个测试值,结果发现并没有输出测试值,说明压根就没有调用。

赶快谷歌了一下,查到了鸟哥的一篇blog,找到了答案:PHP的Calling Scope


简单概述,php在检查方法是否存在的时候,忽略方法是不是静态方法,只要用同名的方法,结果都是存在。

这里再补充一点,也不会检查方法名大小写问题,coder和Coder会被人为同一个方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员无为

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值