我在许多Symfony包中(以及其他代码中)看到过这一行:
@trigger_error('The class is deprecated', E_USER_DEPRECATED);
根据文档,@
(at)运算符用于消除错误(http://php.net/manual/en/language.operators.errorcontrol.php)。
那么,抛出沉默错误的目的是什么?
答案 0 :(得分:1)
如Symfony coding conventions中所述:
来自作者的如果没有@-silencing operator,用户需要选择退出弃用通知。沉默交换此行为并允许用户在准备好应对它们时选择加入(通过添加自定义错误处理程序,如Web调试工具栏或PHPUnit桥接器使用的那个)。
Comment关于相关的PR:
......还有一个考虑让我觉得这是最好的:表现。我们可以包含触发"选择加入弃用通知的实施"在一些更多的语义界面背后。但这会增加需要尽可能快的事情的开销。当这可以被称为数千次时,这不是微观优化。 因此,这种原始裸机金属php实现可能看起来很hacky,但它只是满足我们需求的正确实现。
答案 1 :(得分:0)
只是推测,但这可以用于由自定义错误处理程序处理。
示例:
set_error_handler(function ($err_severity, $err_msg, $err_file, $err_line, array $err_context)
{
//Log the error
// error was suppressed with the @-operator
if (0 === error_reporting()) {
return false;
}
// handle error
}
因此,即使被抑制,也可以记录(或以其他方式处理)错误。
除非有关于它的文档,否则您无法确切知道为什么要这样做。由开发人员解释他们为什么这样做。
答案 2 :(得分:0)
除了其他人所说的,according to the docs整个方案可以归结为the following example:
set_error_handler(function ($errno, $errstr) {
var_dump($errstr); // outputs "Will only be seen ..."
}, E_USER_DEPRECATED);
@trigger_error('Will only be seen from a custom error handler', E_USER_DEPRECATED);
否则,如果需要,仍可以从自定义错误处理程序中听到静音的弃用通知,而不会同时污染普通日志。