为什么我得到非静态方法不应该静态调用?

时间:2018-04-20 16:50:12

标签: php laravel laravel-5

我正在学习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应用程序中没有得到这个错误。

3 个答案:

答案 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