PHP7: функция статического класса не может быть вызвана/увидена до тех пор, пока класс не будет экземпляром

У меня есть пользовательский класс с именем Error, который я автоматически загружаю в первую очередь. В моем пользовательском классе у меня есть конструктор и одноэлементная функция Get, например:

class Error
{
    // Singleton object. Leave $me alone.
    private static $me;

    public $errors; // Array of errors
    public $style;  // CSS rules to apply to error elements

    private function __construct($style = "border:1px solid red;")
    {
        $this->errors = array();
        $this->style = $style;          
    }

    // Get Singleton object
    public static function getError()
    {
        if(is_null(self::$me))
            self::$me = new Error();

        return self::$me;
    }
    //...
}

В моем основном включении я всегда готовил синглтон этого пользовательского класса перед основной логикой:

$Error = Error::getError();

Однако в PHP 7 это теперь дает мне ошибку:

Неустранимая ошибка: Uncaught Error: вызов неопределенного метода Error::getError()

Можете ли вы помочь мне понять, почему это больше не работает? Вместо этого я попробовал это, чтобы проверить, загружается ли класс Error вообще, и он работает (и вызывает конструктор):

$Error = new Error();

Почему-то я не могу вызвать функцию статического класса, если я не создал экземпляр этого класса. Это сломает много другой логики, которая у меня есть, если это действительно изменение в php7.


person Tiago    schedule 08.10.2017    source источник
comment
PHP7 имеет встроенный класс Error. Вы, вероятно, испытываете ошибки пространства имен. Существует ли ваш класс Error в пользовательском пространстве имен? php.net/manual/en/class.error.php   -  person Michael Berkowski    schedule 08.10.2017
comment
Если у вас есть возможность навсегда перейти на PHP 7 (ваш код больше не должен работать под 5.x), возможно, вы могли бы просто принять внутренний класс Error вместо своего собственного.   -  person Michael Berkowski    schedule 08.10.2017
comment
@MichaelBerkowski спасибо, это кажется наиболее вероятной причиной такого досадного столкновения. К счастью, мне легко обойти это, так как только одно место вызывает статическую функцию инициализации для моего класса Error. Я проверю, не в этом ли причина. Не стесняйтесь добавлять встроенный комментарий к пространству имен в качестве ответа. Я отмечу это, если это позволит мне решить проблему.   -  person Tiago    schedule 08.10.2017
comment
@MichaelBerkowski рад подтвердить, что вы были правы на 100%. Он конфликтовал со встроенным классом Error в PHP 7. Небольшой рефакторинг решил эту проблему, и остальная часть приложения теперь работает в моей среде PHP 7. Спасибо!   -  person Tiago    schedule 08.10.2017


Ответы (1)


Начиная с PHP 7, PHP включает встроенный класс Error, который конфликтует с классом Error вашего приложения.

Предопределенный класс Error PHP

Если класс вашего собственного приложения не определен в пользовательском пространстве имен, и вы пытаетесь вызвать Error::getError(), PHP предположит, что вы имеете в виду встроенный класс, у которого нет определенного метода getError(). (У него есть аналогичный getMessage() нестатический метод).

Вы можете обойти это, добавив в свое приложение пользовательский namespace, который рекомендуемая практика в любом случае. Или, если ваше приложение не требует продолжения работы под PHP 5.x, рассмотрите возможность его рефакторинга, чтобы вместо этого использовать встроенную функциональность класса Error.

person Michael Berkowski    schedule 08.10.2017