Я изучаю 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, которое делает это.






Поскольку init () является вашим общедоступным методом, а не статическим, вы можете вызывать его через его объект. Попробуйте вызвать это, создав объект класса DB.
$obj = new DB();
$obj->init();
Надеюсь, это поможет тебе.
У этого метода нет ключевого слова 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()
Поскольку метод __callStatic перехватывает только недоступные или несуществующие методы, поэтому, если вы измените
public function init(){
echo 'INIT DB';
}
Чтобы защитить это будет работать
protected function init(){
echo 'INIT DB';
}
Также я раньше задавал вопрос об этом, и я думаю, что это может быть полезно для вас
Вот мой вопрос
Я не знаю, знакомы ли вы с Java или нет, но предполагаю, что это аналогичная ситуация. В Java, если вы хотите вызвать нестатический метод, вы должны создать объект этого класса. Если вы этого не хотите, вы должны сделать метод статическим.