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

问题描述 投票:0回答:5

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

其托管的服务器最近已升级至 PHP 5.4。

此后,我收到了很多错误消息,例如:

[Sat May 26 19:04:41 2012] [error] 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;
}

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

是否有一个 PHP 设置可以修改为“忽略”缺少 static 关键字?

php static-methods
5个回答
44
投票

您可以从

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


31
投票

禁用警报消息并不能解决问题。 尽管 PHP 核心仍在继续工作,但它做出了危险的假设和行为。

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

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

喜欢:

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

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

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

10
投票

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

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

您也可以使用 PHP 5.4 以来的新方法来执行相同的操作:

(new YourClass)->method();

希望对你有帮助!


0
投票

致命错误:未捕获错误:无法在站点第 78 行的 C:\wamp64\www\zeuscart-master (1)\zeuscart-master\Bin\Security.php 中静态调用非静态方法 Bin_Security::checkConfigFile()是不是工作?我可以做什么让网站正常工作?


-4
投票

我用一行代码解决了这个问题,如下所示: 在文件 index.php 中,在模板根目录中,在此代码行之后:

define( '_JEXEC' ) 或 die( '限制访问' );

粘贴这一行: ini_set('display_errors', '关闭');

别担心,开心就好...

由 Jenio 发布。

© www.soinside.com 2019 - 2024. All rights reserved.