PHP7: 静态 class 函数不能 called/seen 直到 class 被实例化
PHP7: Static class function can't be called/seen until class is instanced
我有一个名为 Error
的自定义 class,我会先自动加载它。在我的自定义 class 中,我有一个构造函数和一个单例 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中,我一直在核心逻辑之前准备一个这个自定义的单例class:
$Error = Error::getError();
但是,在 PHP 7 中,这现在给我一个错误:
Fatal error: Uncaught Error: Call to undefined method
Error::getError()
你能帮我理解为什么这不再起作用了吗?我试过这个来检查错误 class 是否正在加载,它确实有效(并调用构造函数):
$Error = new Error();
我无法调用静态 class 函数,除非我实例化了这个 class。如果 php7.
确实发生了变化,这将打破我的许多其他逻辑
从 PHP 7 开始,PHP 包含一个内置的 Error
class,它似乎与您的应用程序的 Error
class.
如果您自己的应用程序的 class 未在自定义命名空间中定义,并且您试图调用 Error::getError()
,PHP 将假设您指的是内置 class 没有定义 getError()
方法。 (它确实有一个类似的 getMessage()
非静态方法)。
您可以通过 adding a custom namespace
对您的应用程序解决这个问题,无论如何这是推荐的做法。或者,如果您的应用程序不需要在 PHP 5.x 下继续 运行,请考虑重构它以使用内置的 Error
class 功能。
我有一个名为 Error
的自定义 class,我会先自动加载它。在我的自定义 class 中,我有一个构造函数和一个单例 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中,我一直在核心逻辑之前准备一个这个自定义的单例class:
$Error = Error::getError();
但是,在 PHP 7 中,这现在给我一个错误:
Fatal error: Uncaught Error: Call to undefined method Error::getError()
你能帮我理解为什么这不再起作用了吗?我试过这个来检查错误 class 是否正在加载,它确实有效(并调用构造函数):
$Error = new Error();
我无法调用静态 class 函数,除非我实例化了这个 class。如果 php7.
确实发生了变化,这将打破我的许多其他逻辑从 PHP 7 开始,PHP 包含一个内置的 Error
class,它似乎与您的应用程序的 Error
class.
如果您自己的应用程序的 class 未在自定义命名空间中定义,并且您试图调用 Error::getError()
,PHP 将假设您指的是内置 class 没有定义 getError()
方法。 (它确实有一个类似的 getMessage()
非静态方法)。
您可以通过 adding a custom namespace
对您的应用程序解决这个问题,无论如何这是推荐的做法。或者,如果您的应用程序不需要在 PHP 5.x 下继续 运行,请考虑重构它以使用内置的 Error
class 功能。