4 回答
![?](http://img1.sycdn.imooc.com/5859e2d50001f6bb01000100-100-100.jpg)
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
![?](http://img1.sycdn.imooc.com/545863aa00014aa802200220-100-100.jpg)
TA贡献1830条经验 获得超9个赞
因为我们定义的 Model
直接继承于 Eloquent/Model
鸟哥在博客中这样说
因为你在一个有 calling scope 的上下文中采用”静态的形式”调用了一个类的非静态方法所致.
我的理解是你在一个定义了 __callStatic
的类中(如 User
)调用非静态方法 User::getTable
。
而 where
等方法是在 Builder
类中的,Eloquent/Model
不直接继承 Builder
。
![?](http://img1.sycdn.imooc.com/5458655200013d9802200220-100-100.jpg)
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 关注
- 794 浏览
添加回答
举报