我正在学习Laravel,而且我学习新框架的方式正在深入,并且发现了魔法是如何发生的。
因此,我学习外墙并爱上它们,并想找到Laravel如何做魔法并找到一种方法来获得类似的特征是__callStatic
魔法。这是我的代码:
class Facade {
public static function __callStatic($method,$args){
$instance = static::getFacade();
return call_user_func_array([$instance, $method], $args);
}
}
class DB extends Facade {
public static function getFacade(){
return new self();
}
public function init(){
echo 'INIT DB';
}
}
DB::init();
代码输出正确,但我收到此错误:
Non-static method DB::init() should not be called statically :21
我不明白为什么我得到这个以及为什么我在Laravel应用程序中没有得到这个错误。
答案 0 :(得分:0)
由于init()是您的公共方法而不是静态方法,您可以通过其对象调用它。 尝试通过创建类DB的对象来调用它。
$obj = new DB();
$obj->init();
希望它会对你有所帮助。
答案 1 :(得分:0)
此方法不具有static
关键字,因此您必须使用该类的实例调用它,并且必须使用此->
运算符而不是::
//this is a static method with static keyword preceding function
public static function getFacade(){
^^^^^^
return new self();
}
// this is non-static method with no static keyword
public function init(){
echo 'INIT DB';
}
非静态:创建一个实例,然后使用->
$instance = new DB();
$instance->init();
静态:无需创建实例,只需使用::
DB::getFacade()
答案 2 :(得分:0)
因为__callStatic
方法仅捕获不可访问或不存在的方法,因此如果您更改
public function init(){
echo 'INIT DB';
}
要受保护,它将起作用
protected function init(){
echo 'INIT DB';
}
我之前也问了一个问题,我认为这对你有帮助 Here is my question