PHP7:在实例化类之前,不能调用/看到静态类函数

时间:2017-10-08 12:58:31

标签: php oop php-7 spl-autoload-register php-7.2

我有一个名为.sxw的自定义类,我先将其自动加载。在我的自定义类中,我有一个构造函数和一个单独的Get函数,如下所示:

Error

在我的主要包含中,我总是在核心逻辑之前准备一个这个自定义类的单例:

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;
    }
    //...
}

但是,在PHP 7中,现在给出了一个错误:

  

致命错误:未捕获错误:调用未定义的方法   错误:: getError()

你能帮助我理解为什么它不再起作用了吗?我试过这个来检查是否正在加载Error类,它确实有效(并调用构造函数):

$Error = Error::getError();

不知怎的,我不能调用静态类函数,除非我已经实例化了这个类。如果这真的是php7的变化,这将打破我的许多其他逻辑。

1 个答案:

答案 0 :(得分:1)

从PHP 7开始,PHP包含一个内置的Error类,它似乎与您的应用程序的Error类冲突。

PHP pre-defined Error class

如果您自己的应用程序的类未在自定义命名空间中定义并且您尝试调用Error::getError(),那么PHP将假定您的意思是没有定义getError()的内置类方法。 (它确实有类似的getMessage()非静态方法。)

您可以通过adding a custom namespace向您的应用程序解决此问题,无论如何这是推荐的做法。或者,如果您的应用程序不需要继续在PHP 5.x下运行,请考虑重构它以使用内置的Error类功能。