PHP中的@符号有什么用?

sv_*_*_in 557 php error-suppression operators

我见过@某些功能的使用,如下所示:

$fileHandle = @fopen($fileName, $writeAttributes);
Run Code Online (Sandbox Code Playgroud)

这个符号有什么用?

Ric*_*dle 618

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

  • 那是一个快速的抽奖! (42认同)
  • 是啊; 到第二个!我必须检查answer-id's,看看谁先进来:) (6认同)
  • 发布后我有时间纠正我的抑制拼写...并且该死的你同时用链接增强*rages*:P (3认同)

Aid*_*ell 456

它可以抑制错误.

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

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

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

  • 因为另一个答案是获得所有的爱而被投票. (147认同)
  • @AidenBell:你从第一天开始就投票了.:-) (29认同)
  • 19落后......来吧人们让我们击败RichieHindle:P (10认同)

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)


nic*_*ckf 58

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


And*_*eas 34

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

但是: 请真的不要使用@操作员.

为什么?

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

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

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

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

简而言之:你应该知道存在类似的东西@(知识总是好的),但不要使用它.许多开发人员(特别是那些调试其他代码的开发人员)将非常感激.

  • 你不应该压制警告——它们是在说明你做错了什么。不存在无法正确检查或处理状态的竞争条件。 (2认同)

Suj*_*mar 7

假设我们没有使用"@"运算符,那么我们的代码将如下所示:

$fileHandle = fopen($fileName, $writeAttributes);
Run Code Online (Sandbox Code Playgroud)

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

要取消错误消息,我们使用"@"运算符,如:

$fileHandle = @fopen($fileName, $writeAttributes);
Run Code Online (Sandbox Code Playgroud)


小智 5

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


fic*_*489 5

@ 抑制错误消息。

它用于代码片段,例如:

@file_get_contents('http://www.exaple.com');
Run Code Online (Sandbox Code Playgroud)

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