【问题标题】:PHP 5.4: disable warning "Creating default object from empty value"PHP 5.4:禁用警告“从空值创建默认对象”
【发布时间】:2012-10-30 17:06:12
【问题描述】:

我想将代码从 PHP 5.2 迁移到 5.4。到目前为止,这工作得很好,除了我使用的所有代码都广泛使用了只使用带有成员的对象而没有任何初始化,例如:

$MyObject->MyMember = "Hello";

导致警告:“从空值创建默认对象”

我知道解决方案是使用:

$MyObject = new stdClass();
$MyObject->MyMember = "Hello";

但是在我的所有代码中更改它会做很多工作,因为我在不同的项目中多次使用它。我知道,这不是很好的风格,但不幸的是,我无法在接下来的几周内将其添加到我的所有代码中。

我知道我可以将 php error_reporting 设置为不报告警告,但我希望仍然能够获得其他警告和通知。此警告似乎根本不受启用或禁用 E_STRICT 的影响。那么有没有办法禁用这个警告?!

【问题讨论】:

  • 我得说,我在 5.4 中不知道这一点 - 看起来我很快就会和你在同一条船上。
  • 是的 - 有时您将无法编写新软件,因为您必须升级到旧软件...
  • 这个警告应该保留E_STRICT,而不是变成E_WARNING!似乎 PHP 开发人员一直在发明新的方法来让我们的生活变得困难。

标签: php error-reporting


【解决方案1】:

我在生产环境中遇到了同样的问题

    \error_reporting(\E_ERROR);

我不得不说我的应用程序不需要/产生错误,它在一个非常受控的环境中,所以这样做不会有太大的伤害,但如果你的应用程序容易出错,你应该拥有你自己的error handler 并使用适当的正则表达式和 preg_match 忽略 “Creating default object from empty value” 警告并自行决定记录/提示其他人。

【讨论】:

    【解决方案2】:

    您真的可以使用 IDE 进行 php 并尝试这样做:

    搜索$MyObject->MyMember = "Hello";

    寻找结果,如果它带来了正确的东西,请尝试将其替换为:

    $MyObject = new stdClass();
    $MyObject->MyMember = "Hello";
    

    所以也许 IDE 会为您完成长期的工作......

    【讨论】:

    • 这是一个大错误!!如果 $MyObject 已经存在怎么办!你必须先检查它:if (!isset($MyObject)) $MyObject = new stdClass();
    • 我的项目中有几个位置$MyObject = new stdClass(); $MyObject->MyMember = "Hello"; 仍然给出错误消息。我不知道为什么。
    【解决方案3】:

    我知道我可以将 php error_reporting 设置为不报告警告,但我希望仍然能够收到其他警告和通知。

    不要禁用错误报告,将其保留在适当的级别,但禁用display_errors 指令:

    ini_set('display_errors', 0);
    

    没有理由在生产中将通知打印到屏幕上。

    然后正如 Jon 所说,如果您还没有使用自定义错误处理程序,例如:

    function my_error_handler($error_level, $error_message)
    {
        // write error message to log file
    }
    set_error_handler('my_error_handler');
    

    您可以将错误报告级别传递给set_error_handler 的第二个参数。这样您就可以花时间做正确的事情,即修复代码以停止生成通知。

    如果您将很多网站迁移到 5.4,您可以让您的服务器管理员在 php.ini 中关闭 display_errors,直到您有足够的时间来修复所有问题。更好的是,在升级之前暂存所有内容并修复它,但这可能不是一个选择。

    【讨论】:

      【解决方案4】:

      从技术上讲,您可以通过installing your own error handler 执行此操作以获取警告。从处理程序内部检查字符串错误消息;如果它是你想要抑制的那个,那么return true,否则return false 让默认的错误处理程序来做它的事情。

      但是,我仍然建议您做正确的事情并在出现这种滥用的任何地方手动修复您的代码,因为如果不出意外的话,它会让您养成正确的习惯。除非这是有偿工作(在这种情况下,通常会出现超越实施纯度的担忧),否则请将此视为一个教训并做正确的事。

      【讨论】:

      • 我担心有人会这样回答 ;-) 是的,你完全正确,让我看看有没有时间。
      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 2013-06-19
      相关资源
      最近更新 更多