10

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

$MyObject->MyMember = "Hello";

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

我知道解决方案是使用:

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

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

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

4

4 回答 4

8

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

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

于 2012-11-10T16:57:38.097 回答
4

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

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

ini_set('display_errors', 0);

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

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

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,直到您有足够的时间来修复所有问题。更好的是,在升级之前暂存所有内容并修复它,但这可能不是一个选择。

于 2012-11-10T17:05:07.657 回答
2

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

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

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

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

所以也许IDE会为你做长时间的工作......

于 2013-03-23T21:27:37.167 回答
0
于 2014-02-04T18:28:12.533 回答