我看到过在某些函数前使用@,比如:

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

这个符号有什么用?


当前回答

假设我们没有使用“@”操作符,那么我们的代码看起来像这样:

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

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

为了抑制错误消息,我们使用“@”操作符,例如:

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

其他回答

它抑制错误。

参见手册中的错误控制操作符:

PHP支持一个错误控制操作符:@符号。当在PHP中添加到表达式前时,该表达式可能生成的任何错误消息都将被忽略。 如果你已经用set_error_handler()设置了一个自定义错误处理函数,那么它仍然会被调用,但是这个自定义错误处理函数可以(并且应该)调用error_reporting(),当触发错误的调用前面有@…

假设我们没有使用“@”操作符,那么我们的代码看起来像这样:

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

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

为了抑制错误消息,我们使用“@”操作符,例如:

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

它抑制错误消息-请参阅PHP手册中的错误控制操作符。

如果打开失败,则生成E_WARNING级别的错误。你可以使用@来屏蔽这个警告。

符号@是错误控制操作符(又名“沉默”或“关闭”操作符)。它使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;
}