我想将代码从 PHP 5.2 迁移到 5.4。到目前为止,这工作正常,除了我使用的所有代码都广泛使用仅使用带有成员的对象而无需任何初始化,例如:
$MyObject->MyMember = "Hello";
这会导致警告:"从空值创建默认对象">
我知道解决方案是使用:
$MyObject = new stdClass();
$MyObject->MyMember = "Hello";
但是在我的所有代码中更改它需要做很多工作,因为我在不同的项目中多次使用它。我知道,这不是好的风格,但不幸的是,我无法在接下来的几周内将其添加到我的所有代码中。
我知道我可以将 php error_reporting设置为不报告警告,但我希望仍然能够收到其他警告和通知。此警告似乎根本不受启用或禁用E_STRICT的影响。那么有没有办法禁用此警告?!
从技术上讲,您可以通过安装自己的警告错误处理程序来执行此操作。从处理程序内部检查字符串错误消息;如果它是您要抑制的那个,则return true
,否则return false
让默认错误处理程序执行其操作。
但是,我仍然建议做正确的事情,并在出现这种误用的地方手动修复您的代码,因为如果没有别的,它会让您养成正确的习惯。除非这是有偿工作(在这种情况下,通常会有凌驾于实施纯度之上的担忧),否则请将其视为一个教训并做正确的事情。
我可以将 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 中关闭display_errors
.ini直到您有足够的时间修复所有内容。更好的是,在升级之前暂存所有内容并修复它,但这可能不是一种选择。
你真的可以使用一个PHP的IDE并尝试这样做:
搜索$MyObject->MyMember = "Hello";
寻找结果,如果它带来了正确的东西,请尝试将其替换为:
$MyObject = new stdClass();
$MyObject->MyMember = "Hello";
所以也许 IDE 会为你做长期的工作......
我遇到了同样的问题,我在生产环境中像波纹管一样处理它
error_reporting(E_ERROR);
我不得不说我的应用程序不需要/生成错误,它在一个非常受控的环境中,所以这样做不会有太大的伤害,但是如果你的应用程序是一个容易出错的应用程序,你应该有自己的错误处理程序,并有一个适当的正则表达式和preg_match忽略“Creating default object from empty value”
警告并自行决定记录/提示其他人。