4 回答
TA贡献1818条经验 获得超7个赞
在Model中,where方法是不存在的,而getTable方法却是存在的。之所以这么说,是php因为兼容性的考虑,在检查方法是否存在的时候,并不会去检查是不是静态方法,只要方法存在,不管是静态还是非静态,都认为是方法存在的,因此就不会调用__callStatic方法了。
这也就造成了调用Model::where的时候,由于where方法是在Illuminate\Database\Eloquent\Builder中定义的,__call将该方法的调用代理到了Builder上,因此可以调用。而getTable方法,则因为是Model中的实例方法,做方法存在性判断的时候发现方法有了,就不会去调用__callStatic,直接对该方法进行静态调用,所有就抛出了
Non-static method IlluminateDatabaseEloquentModel::getTable() should not be called statically, assuming $this from incompatible context
TA贡献1830条经验 获得超9个赞
因为我们定义的 Model 直接继承于 Eloquent/Model
鸟哥在博客中这样说
因为你在一个有 calling scope 的上下文中采用”静态的形式”调用了一个类的非静态方法所致.
我的理解是你在一个定义了 __callStatic 的类中(如 User)调用非静态方法 User::getTable。
而 where 等方法是在 Builder 类中的,Eloquent/Model 不直接继承 Builder。
TA贡献1784条经验 获得超7个赞
getTable方法在Model里面定义的是非静态方法
public function getTable()
直接调用PHP就会跳出了一个Strict错误。
而调用Model::where的时候,由于where没有在Model里面定义,PHP会找Model里面的__callStatic,将where方法代理到目标类里面。
Model的__callStatic方法注释也解释的很清楚
/**
* Handle dynamic static method calls into the method.
*
* @param string $method
* @param array $parameters
* @return mixed
*/
public static function __callStatic($method, $parameters)
{
$instance = new static;
return call_user_func_array([$instance, $method], $parameters);
}
- 4 回答
- 0 关注
- 842 浏览
添加回答
举报
