Почему у меня нестатический метод не должен вызываться статически?

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

Я не знаю, знакомы ли вы с Java или нет, но предполагаю, что это аналогичная ситуация. В Java, если вы хотите вызвать нестатический метод, вы должны создать объект этого класса. Если вы этого не хотите, вы должны сделать метод статическим.

rawsly 20.04.2018 19:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
1 774
3

Ответы 3

Поскольку 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';
  }

Также я раньше задавал вопрос об этом, и я думаю, что это может быть полезно для вас
Вот мой вопрос

Другие вопросы по теме