PHP 5.4:禁用警告“从空值创建默认对象”

PHP 5.4: disable warning "Creating default object from empty value"

提问人:Werner 提问时间:11/11/2012 最后编辑:hakreWerner 更新时间:2/5/2014 访问量:55513

问:

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

$MyObject->MyMember = "Hello";

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

我知道解决方案是使用:

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

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

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

PHP 错误报告

评论

0赞 Wesley Murch 11/11/2012
我不得不说,我在 5.4 中不知道这件事——看起来我很快就会和你在同一条船上。
0赞 Werner 11/14/2012
是的 - 有时您将无法编写新软件,因为您必须升级到旧软件......
2赞 Tomas 11/20/2013
这个警告应该留下来,而不是成为!似乎PHP开发人员正在不断发明新的方法来使我们的生活变得困难。E_STRICTE_WARNING

答:

8赞 Jon 11/11/2012 #1

从技术上讲,您可以通过安装自己的警告错误处理程序来做到这一点。从处理程序内部检查字符串错误消息;如果它是您要抑制的那个,那么 ,否则让默认的错误处理程序做它的事情。return truereturn false

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

评论

0赞 Werner 11/14/2012
我担心有人会这样回答;-)是的,你说得很对,让我们看看我是否找到时间。
4赞 Wesley Murch 11/11/2012 #2

我知道我可以将 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

2赞 Komdev 3/24/2013 #3

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

寻找$MyObject->MyMember = "Hello";

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

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

因此,也许 IDE 会为您完成漫长的工作......

评论

2赞 Tomas 11/20/2013
这是一个很大的错误!!如果$MyObject已经存在怎么办!您必须首先检查它:if (!isset($MyObject)) $MyObject = new stdClass();
0赞 thinsoldier 2/15/2014
我的项目有几个位置仍然给出错误消息。我不知道为什么。$MyObject = new stdClass(); $MyObject->MyMember = "Hello";
0赞 dariush 2/5/2014 #4

我遇到了同样的问题,我在生产环境中像以下一样处理它

    \error_reporting(\E_ERROR);

我不得不说我的应用程序不需要/生成错误,它位于一个非常受控的环境中,所以这样做不会有太大伤害,但是如果您的应用程序容易出错,您应该拥有自己的错误处理程序,并使用适当的正则表达式,preg_match忽略“从空值创建默认对象”警告并自行决定记录/提示其他人。