【问题标题】:PHP7: Static class function can't be called/seen until class is instancedPHP7:在类被实例化之前不能调用/看到静态类函数
【发布时间】:2023-03-04 10:53:01
【问题描述】:

我有一个名为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;
    }
    //...
}

在我的master include中,我总是在核心逻辑之前准备了这个自定义类的单例:

$Error = Error::getError();

然而,在 PHP 7 中,这给了我一个错误:

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

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

$Error = new Error();

除非我实例化了这个类,否则我无法调用静态类函数。如果这真的是 php7 的变化,这将打破我的许多其他逻辑。

【问题讨论】:

  • PHP7 有一个内置的Error 类。您可能遇到命名空间错误。您的 Error 类是否存在于自定义命名空间中? php.net/manual/en/class.error.php
  • 如果您能够永久升级到 PHP 7(您的代码不再需要在 5.x 下运行),也许您可​​以采用内部的 Error 类来代替您自己的。
  • @MichaelBerkowski 谢谢,这似乎是最可能的原因,多么不幸的冲突。幸运的是,这对我来说很容易过去,因为只有一个地方为我的 Error 类调用了静态初始化函数。我会检查是否是这个原因。随意添加“内置”命名空间注释作为答案。如果这让我解决问题,我会标记它。
  • @MichaelBerkowski 很高兴确认您 100% 正确。它与 PHP 7 中的内置 Error 类发生冲突。小的重构解决了这个问题,应用程序的其余部分现在在我的 PHP 7 环境中运行。谢谢!

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


【解决方案1】:

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

PHP pre-defined Error class

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多