【问题标题】:How can I solve "Non-static method xxx:xxx() should not be called statically in PHP 5.4?如何解决“在 PHP 5.4 中不应静态调用非静态方法 xxx:xxx()?
【发布时间】:2012-06-01 20:55:45
【问题描述】:

目前在使用大平台的PHP。

它所在的服务器最近已升级到 PHP 5.4。

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

[2012 年 5 月 26 日星期六 19:04:41] [错误] 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 设置我可以修改为“忽略”缺少静态关键字?

【问题讨论】:

标签: php static-methods


【解决方案1】:

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

【讨论】:

  • 谢谢 lanzz - 这也是我的想法。我很犹豫是否让它们纯粹是静态的,因为我不确定它们是否也是从非静态上下文中调用的。我将尝试从 error_reporting() 中删除 E_STRICT 并回复您。谢谢。
  • 使用您的 getData() 实现,无需在非静态上下文中调用,因为它不会以任何方式操作实例数据;如果它确实适用于实例数据,您将无法在静态上下文中调用它。
  • 感谢 lanzz - 但是还有其他方法会抛出相同的警告,这些警告可能会被非静态调用。您在 error_reporting() 中简单地关闭严格错误的建议似乎已经抑制了这个问题。谢谢!
  • 从 PHP 5.6 起,在静态上下文中调用非静态函数现在已被弃用,并且该功能将在未来版本中完全删除,因此完全不鼓励这样做。
  • Gracias por tus comentarios, he probado esto y me funcionó /​​error_reporting(E_ALL);*/
【解决方案2】:

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

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

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

赞:

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

如果类不是单例,使用

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

【讨论】:

    【解决方案3】:

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

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

    你也可以使用 PHP 5.4 以后的新方法来做同样的事情:

    (new YourClass)->method();
    

    希望对你有帮助!

    【讨论】:

      【解决方案4】:

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

      defined('_JEXEC') or die('Restricted access');

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

      别担心,开心就好……

      由杰尼奥发布。

      【讨论】:

      • 这将隐藏所有错误。出于安全考虑,最好不要向用户显示错误,但是它们可能仍会出现在日志文件中或在开发时。这种方法可能不会注意到其他真实的问题。
      • 这不会解决任何问题,并且会使其他问题更难检测。
      • 在繁忙的网站上,如果您只是不显示它们(在 HTML 文件中/向客户端显示)但仍然启用它们,您每天可能有 100 MB 的日志数据(error_log 文件) (在 PHP 中为 E_STRICT)。我也发生过。
      猜你喜欢
      • 2018-02-23
      • 2014-09-08
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      相关资源
      最近更新 更多