www说
这个@符号是差错控制操作者(又称“沉默”或“关闭”操作员)。它使PHP禁止由关联表达式生成的任何错误消息(注意、警告、致命等)。它的工作原理就像一个一元运算符,例如,它具有优先性和结合性。以下是一些例子:@echo 1 / 0;// generates "Parse error: syntax error, unexpected T_ECHO" since // echo is not an expressionecho @(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_HANDER()设置了一个自定义错误处理程序函数,那么它仍然会被调用,但是这个自定义错误处理程序可以(而且应该)调用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;}