如何解决"非静态方法xxx:xxx()不应该在PHP 5.4中静态调用?

kae*_*ese 30 php static-methods

目前在PHP中使用大型平台.

它托管的服务器最近已升级到PHP 5.4.

从那以后,我收到了很多错误消息,如:

[Sat 5月26日19:04:41 2012] [错误] PHP严格标准:非静态方法Config :: getData()不应该静态调用,假设$ this来自/xxx/Config.inc.php中的不兼容上下文第35行

示例方法定义为(注意缺少'static'关键字):

function &getData() {
            $configData =& Registry::get('configData', true, null);

    if ($configData === null) {
        // Load configuration data only once per request, implicitly
        // sets config data by ref in the registry.
        $configData = Config::reloadData();
    }

    return $configData;
}
Run Code Online (Sandbox Code Playgroud)

这之前没有引起任何问题,我认为错误消息(导致应用程序崩溃)可能与最近升级到PHP5.4有关.

是否有PHP设置我可以修改为"忽略"缺少静态关键字?

lan*_*nzz 42

您可以删除E_STRICTerror_reporting(),或者你可以简单地让你的方法静态的,如果你需要静态调用它.据我所知,没有(严格的)方法可以调用静态和非静态方法.另外,哪个更烦人,你不能有两个同名的方法,一个是静态的,另一个是非静态的.

  • 从PHP 5.6开始,现在不推荐在静态上下文中调用非静态函数,并且在将来的版本中将完全删除该功能,因此应该完全不鼓励这样做. (5认同)

vol*_*inc 29

禁用警报消息不是解决问题的方法.尽管PHP核心仍在继续工作,但它仍然是一个危险的假设和行动.

永远不要忽视PHP应该做出某些假设的错误!

如果将类组织为单例,则可以始终使用函数getInstance()然后使用getData()

Likse:

$classObj = MyClass::getInstance();
$classObj->getData();
Run Code Online (Sandbox Code Playgroud)

如果该类不是单例,请使用

 $classObj = new MyClass();
 $classObj->getData();
Run Code Online (Sandbox Code Playgroud)


Bru*_*pos 10

我不建议您只是隐藏项目中的严重错误.Intead,你应该把你的方法变成静态或尝试创建一个新的对象实例:

$var = new YourClass();
$var->method();
Run Code Online (Sandbox Code Playgroud)

从PHP 5.4开始,您也可以使用新方法执行相同的操作:

(new YourClass)->method();
Run Code Online (Sandbox Code Playgroud)

我希望它对你有所帮助!