在trigger_error之前'@'(沉默运算符,符号)的目的是什么?

时间:2017-01-09 10:18:58

标签: php error-handling

我在许多Symfony包中(以及其他代码中)看到过这一行:

@trigger_error('The class is deprecated', E_USER_DEPRECATED);

根据文档,@(at)运算符用于消除错误(http://php.net/manual/en/language.operators.errorcontrol.php)。

那么,抛出沉默错误的目的是什么?

3 个答案:

答案 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);

否则,如果需要,仍可以从自定义错误处理程序中听到静音的弃用通知,而不会同时污染普通日志。