问题描述
在Laravel Framework中,既可以将模型方法用作静态方法,也可以将非静态方法用作模型,例如,您可以像这样从Databse获取用户:
User::where('id',1)->first();
也这样:
$user = new User();
$user->where('id',1)->first();
如何用PHP做到这一点? 因为据我所知,一种方法只能是静态或非静态的,而不能同时是两者。
解决方法
这是通过魔术方法__callStatic
完成的,该方法正在创建模型的新实例,然后在其上调用该方法。此特定方法where
在模型上不存在,由魔术方法__call
处理,该方法正在Eloquent Builder实例上调用此方法。
PHP.net Manual - OOP - Overloading __callStatic
__call
Laravel - Github - Eloquent Model __callStatic