sv_*_*_in 557 php error-suppression operators
我见过@某些功能的使用,如下所示:
$fileHandle = @fopen($fileName, $writeAttributes);
Run Code Online (Sandbox Code Playgroud)
这个符号有什么用?
Aid*_*ell 456
它可以抑制错误.
请参阅手册中的错误控制操作符:
PHP支持一个错误控制操作符:at符号(@).当在PHP中添加表达式时,将忽略该表达式可能生成的任何错误消息.
如果您使用set_error_handler()设置了自定义错误处理函数,那么它仍然会被调用,但是这个自定义错误处理程序可以(并且应该)调用error_reporting(),当触发错误的调用前面有@时,它将返回0 ...
Sal*_*n A 222
的@符号是差错控制操作(也称为"沉默"或"闭嘴"运算符).它使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"
Run Code Online (Sandbox Code Playgroud)
如果使用自定义错误处理程序而不是标准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"
Run Code Online (Sandbox Code Playgroud)
错误处理程序未检查@符号是否生效.手册建议如下:
function better_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
if(error_reporting() !== 0) {
echo "[better_error_handler]: $errstr";
}
// take appropriate action
return true;
}
Run Code Online (Sandbox Code Playgroud)
And*_*eas 34
就像之前已经回答的一样:@运算符会抑制PHP中的所有错误,包括通知,警告甚至是严重错误.
但是: 请真的不要使用@操作员.
为什么?
好吧,因为当您使用@运算符进行错误抑制时,您根本不知道发生错误时从哪里开始.我已经对遗留代码有了一些"乐趣",其中一些开发@人员经常使用运算符.特别是在文件操作,网络调用等情况下.这些都是许多开发人员推荐使用@运算符的情况,因为这里有时会出现错误(例如第三方API无法访问等等). ).
但仍然没有使用它的重点是什么?让我们从两个角度来看看:
作为开发人员:何时@使用,我完全不知道从哪里开始.如果有数百甚至数千个函数调用,@则错误可能就像everyhwere一样.在这种情况下无法进行合理的调试.即使它只是一个第三方错误 - 那么它很好,你做得很快.;-)此外,最好在错误日志中添加足够的详细信息,以便开发人员能够轻松决定日志条目是否必须进一步检查,或者只是第3方失败超出了开发人员的范围.
作为用户:用户根本不关心错误的原因.软件可供他们工作,完成特定任务等.他们不关心是开发人员的错还是第三方问题.特别是对于用户,我强烈建议记录所有错误,即使它们超出范围.也许您会注意到特定的API经常脱机.你能做什么?您可以与您的API合作伙伴交谈,如果他们无法保持稳定,您应该寻找其他合作伙伴.
简而言之:你应该知道存在类似的东西@(知识总是好的),但不要使用它.许多开发人员(特别是那些调试其他代码的开发人员)将非常感激.
假设我们没有使用"@"运算符,那么我们的代码将如下所示:
$fileHandle = fopen($fileName, $writeAttributes);
Run Code Online (Sandbox Code Playgroud)
如果找不到我们试图打开的文件怎么办?它将显示错误消息.
要取消错误消息,我们使用"@"运算符,如:
$fileHandle = @fopen($fileName, $writeAttributes);
Run Code Online (Sandbox Code Playgroud)
@ 抑制错误消息。
它用于代码片段,例如:
@file_get_contents('http://www.exaple.com');
Run Code Online (Sandbox Code Playgroud)
如果无法访问域“ http://www.exaple.com ”,则会显示错误,但@不会显示任何内容。