32

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

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

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

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

示例方法定义为(注意缺少“静态”关键字):

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 设置?

4

4 回答 4

44

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

于 2012-05-26T18:15:31.863 回答
31

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

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

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

喜欢:

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

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

 $classObj = new MyClass();
 $classObj->getData();
于 2015-03-02T14:08:38.227 回答
10

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

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

自 PHP 5.4 起,您也可以使用新的方法来做同样的事情:

(new YourClass)->method();

我希望它对你有帮助!

于 2016-05-15T23:05:32.383 回答
-4

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

定义('_JEXEC')或死('限制访问');

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

别担心,开心就好...

由杰尼奥发布。

于 2015-03-02T13:53:03.523 回答