PHP中的@符号有什么用?

时间:2009-06-23 12:08:33

标签: php operators error-suppression

我在某些功能面前看到@的使用,如下所示:

$fileHandle = @fopen($fileName, $writeAttributes);

这个符号有什么用?

11 个答案:

答案 0 :(得分:607)

它会抑制错误消息 - 请参阅PHP手册中的Error Control Operators

答案 1 :(得分:438)

它可以抑制错误。

请参阅手册中的Error Control Operators

  

PHP支持一个错误控制操作符:at符号(@)。当在PHP中添加表达式之前,将忽略该表达式可能生成的任何错误消息。

     

如果您使用set_error_handler()设置了自定义错误处理函数,那么它仍然会被调用,但是这个自定义错误处理程序可以(并且应该)调用error_reporting(),当触发的调用时它将返回0错误之前是@ ...

答案 2 :(得分:219)

@符号是error control operator(又称“静音”或“关闭”运算符)。它使PHP抑制由关联表达式生成的任何错误消息(通知,警告,致命等)。它就像一元运算符一样工作,例如,它具有优先级和关联性。以下是一些例子:

@echo 1 / 0;
// generates "Parse error: syntax error, unexpected T_ECHO" since 
// echo is not an expression

echo @(1 / 0);
// suppressed "Warning: Division by zero"

@$i / 0;
// suppressed "Notice: Undefined variable: i"
// displayed "Warning: Division by zero"

@($i / 0);
// suppressed "Notice: Undefined variable: i"
// suppressed "Warning: Division by zero"

$c = @$_POST["a"] + @$_POST["b"];
// suppressed "Notice: Undefined index: a"
// suppressed "Notice: Undefined index: b"

$c = @foobar();
echo "Script was not terminated";
// suppressed "Fatal error: Call to undefined function foobar()"
// however, PHP did not "ignore" the error and terminated the
// script because the error was "fatal"

如果使用自定义错误处理程序而不是标准PHP错误处理程序,会发生什么:

  

如果您已设置自定义错误处理函数   set_error_handler()然后它仍然会被调用,但这个自定义   错误处理程序可以(并且应该)调用error_reporting()   当触发错误的调用前面有@。

时返回0

以下代码示例说明了这一点:

function bad_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
    echo "[bad_error_handler]: $errstr";
    return true;
}
set_error_handler("bad_error_handler");
echo @(1 / 0);
// prints "[bad_error_handler]: Division by zero"

错误处理程序未检查@符号是否生效。该手册建议如下:

function better_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
    if(error_reporting() !== 0) {
        echo "[better_error_handler]: $errstr";
    }
    // take appropriate action
    return true;
}

答案 3 :(得分:58)

另请注意,尽管隐藏了错误,但仍会执行任何自定义错误处理程序(使用set_error_handler设置)!

答案 4 :(得分:32)

之前已经有人回答:@运算符会抑制PHP中的所有错误,包括通知,警告甚至是严重错误。

但是: 请真的不要使用@运算符。

<强>为什么吗

好吧,因为当您使用@运算符进行错误抑制时,您根本不知道发生错误时从哪里开始。我已经使用遗留代码获得了一些“乐趣”,其中一些开发人员经常使用@运算符。特别是在文件操作,网络调用等情况下。这些都是许多开发人员推荐使用@运算符的情况,因为这里有时会出现错误(例如第三方API可能会超出范围)无法到达,等等。)。

但仍然没有使用它的重点是什么?让我们从两个角度来看看:

作为开发者: 当使用@时,我完全不知道从哪里开始。如果有@的数百甚至数千个函数调用,则错误可能就像每个人一样。在这种情况下无法进行合理的调试。即使它只是一个第三方错误 - 那么它很好,你做得很快。 ;-)此外,最好在错误日志中添加足够的详细信息,这样开发人员就可以轻松决定日志条目是否必须进一步检查,或者只是第3方失败超出了开发人员的范围。 / p>

作为用户: 用户根本不关心错误的原因。软件可供他们工作,完成特定任务等。他们不关心是开发人员的错还是第三方问题。特别是对于用户,我强烈建议记录所有错误,即使它们超出范围。也许您会注意到特定的API经常脱机。你能做什么?您可以与您的API合作伙伴交谈,如果他们无法保持稳定,您应该寻找其他合作伙伴。

简而言之:您应该知道存在@(知识总是好的),但不要使用。许多开发人员(尤其是那些调试其他代码的开发人员)将非常感激。

答案 5 :(得分:7)

假设我们还没有使用&#34; @&#34;运算符然后我们的代码看起来像这样:

$fileHandle = fopen($fileName, $writeAttributes);

如果找不到我们试图打开的文件怎么办?它将显示错误消息。

要取消错误消息,我们正在使用&#34; @&#34;运营商如:

$fileHandle = @fopen($fileName, $writeAttributes);

答案 6 :(得分:5)

如果打开失败,则会生成级别为E_WARNING的错误。您可以使用@来禁止此警告。

答案 7 :(得分:4)

@会抑制错误消息。

它用于代码片段,如:

@file_get_contents('http://www.exaple.com');

如果无法访问域“http://www.exaple.com”,则会显示错误,但@未显示任何内容。

答案 8 :(得分:1)

PHP支持一个错误控制操作符:at符号child.js。当在PHP中添加表达式之前,将忽略该表达式可能生成的任何错误消息。

如果您使用ATOM_SHELL_INTERNAL_RUN_AS_NODE = 1设置了自定义错误处理函数,那么它仍然会被调用,但是这个自定义错误处理程序可以(并且应该)调用0,这将返回(@)时触发错误的调用之前是set_error_handler()

error_reporting()

注意: -

1)@ -operator仅适用于表达式。

2)一个简单的经验法则是:如果你可以获取某些东西的值,你可以在它前面添加@运算符。例如,您可以将它添加到变量,函数和包含调用,常量等等。您不能将它添加到函数或类定义或条件结构(如if和foreach等)之前。

警告: -

  

目前&#34; @&#34;错误控制运营商前缀甚至会禁用   错误报告将终止脚本的严重错误   执行。除此之外,这意味着如果你使用&#34; @&#34;至   抑制某个功能的错误,并且它不可用   或者错误输入,脚本将在那里死亡   指示为什么。

答案 9 :(得分:1)

在使用@时你可能需要注意的一些指示可能值得一提,对于完整的向下看这篇文章:http://mstd.eu/index.php/2016/06/30/php-rapid-fire-what-is-the-symbol-used-for-in-php/

  1. 即使前缀为@符号,错误处理程序仍会被触发,它只是意味着设置了错误级别0,这必须在自定义错误处理程序中正确处理。

  2. 在@中添加include会将包含文件中的所有错误设置为错误级别0

答案 10 :(得分:1)

@禁止该函数引发的错误消息。文件没有退出时,fopen会引发错误。 @符号使执行移动到下一行,即使该文件不存在。我的建议是在开发PHP代码时不要在本地环境中使用此功能。