Зачем статическому классу обязательно прописывать метод конструктора?

Интересует момент с статическим классом, по большому счету я использую классы, как набор данных с методами и при необходимости обращаюсь конкретно к какому то методу, но когда я создаю класс без конструктора именно статический класс, php выдает ошибку.

Пример кода:
class Router {
    static protected $url;
    static protected $path;

    static public    $param = array();
    static public    $page;

    public function __construct(){
        
    }
    static function url() {
        self::$url = parse_url('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
        self::$path = explode('/',self::$url['path']);

        foreach (self::$path as $el) {
            if (empty($el)){continue;}
            self::$param[] = urldecode(trim($el));
        }

        self::$param[0] = !isset(self::$param[0]) ? 'show' : self::$param[0];
        self::$page     = self::$param[0];
    }

    static function router (){
        $sql = SQL::getInstance();
        $sql->where(false,'page');
        $sql->add('page',self::$page);
        $sql->query();

        if ($sql->sum()){
            include PATH;
        }else{
            include HOME;
        }
    }
}
  • Вопрос задан
  • 2549 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Непонятно зачем вам тут вообще класс...

Если пишите класс, не используйте статику. Вообще. Статические методы могут облегчать доступ к объекту, туда можно выносить какую-то простенькую логику инициализации (фабрики как статические методы) но просто так городить статику...

Что до обязательного наличия конструктора - оно не обязательно. Проблема в статическом методе router, который имеет одно имя с классом и воспринимается как конструктор. Но конструктор не может быть статическим. Когда вы определяете явно конструктор - то проблема "исчезает"...

PHP Fatal error: Constructor Router::router() cannot be static


Об этом вам ошибки и говорят, учитесь их читать. Как вариант, просто переименуйте его в handleRoute или чего-то такое.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы