我在某些功能面前看到@
的使用,如下所示:
$fileHandle = @fopen($fileName, $writeAttributes);
这个符号有什么用?
答案 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/
即使前缀为@符号,错误处理程序仍会被触发,它只是意味着设置了错误级别0,这必须在自定义错误处理程序中正确处理。
在@中添加include会将包含文件中的所有错误设置为错误级别0
答案 10 :(得分:1)
@
禁止该函数引发的错误消息。文件没有退出时,fopen
会引发错误。 @
符号使执行移动到下一行,即使该文件不存在。我的建议是在开发PHP代码时不要在本地环境中使用此功能。