提问者:小点点

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


目前使用PHP中的一个大型平台。

它所承载的服务器最近已经升级到PHP 5.4。

从那时起,我收到了许多错误消息,例如:

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

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

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

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

有没有一个PHP设置我可以修改‘忽略’缺乏静态关键字?


共3个答案

匿名用户

您可以从error_reporting()中删除e_strict,或者如果需要静态地调用方法,也可以简单地将其设置为静态。据我所知,没有(严格的)方法可以拥有一个既可以作为静态方法又可以作为非静态方法调用的方法。还有,哪个更烦人,你不能有两个同名的方法,一个是静态的,另一个是非静态的。

匿名用户

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

千万不要忽略PHP应该对某件事情做出假设的错误!!!!

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

Likse:

$classObj = MyClass::getInstance();
$classObj->getData();

如果类不是单例,请使用

 $classObj = new MyClass();
 $classObj->getData();

匿名用户

我不建议你只是隐藏项目中的严格错误。最后,您应该将方法转换为静态方法,或者尝试创建对象的新实例:

$var = new YourClass();
$var->method();

您也可以使用自PHP 5.4以来的新方法来完成相同的操作:

(new YourClass)->method();

希望能帮到你!