首页 文章

PHP中的@符号有什么用?

提问于
浏览
520

我见过在某些函数前面使用 @ ,如下所示:

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

这个符号有什么用?

11 回答

  • 1

    它会抑制错误消息 - 请参阅PHP手册中的Error Control Operators .

  • 587

    它可以抑制错误 .

    请参阅手册中的Error Control Operators

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

  • 5

    @ 符号是error control operator(又名"silence"或"shut-up"运算符) . 它使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;
    }
    
  • 1

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

  • 2

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

    BUT: Please, really do not use the @ operator at all.

    Why?

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

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

    As a developer: 当使用 @ 时,我完全不知道从哪里开始 . 如果有 @ 的数百甚至数千个函数调用,则错误可能就像每个人一样 . 在这种情况下,无法进行合理的调试即使它只是一个第三方错误 - 然后它快速完成了's just fine and you' . ;-)而且,它只是一个超出开发人员范围的第三方失败 .

    As a user: 如果_849240错误或第三方问题,用户请小心 . 特别是对于用户,我强烈建议记录所有错误,即使他们发现特定的API经常脱机也是如此 . 你能做什么?您可以与您的API合作伙伴交谈,如果他们无法保持稳定,您应该寻找其他合作伙伴 .

    In short: 你应该知道存在像 @ (知识总是好的),但只是 do not use it . 许多开发人员(尤其是那些调试其他代码的开发人员)将非常感激 .

  • 0

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

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

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

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

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

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

  • 7

    @ 禁止错误消息 .

    它用于以下代码片段:

    @file_get_contents('http://www.exaple.com');
    

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

  • 419

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

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

    <?php
    /* Intentional file error */
    $my_file = @file ('non_existent_file') or
        die ("Failed opening file: error was '$php_errormsg'");
    
    // this works for any expression, not just functions:
    $value = @$cache[$key];
    // will not issue a notice if the index $key doesn't exist.
    
    ?>
    

    Note:-

    1)@ -operator仅适用于表达式 .

    2)一个简单的经验法则是:如果你可以获取某些东西的值,你可以在它前面添加@运算符 . 例如,您可以将它添加到变量,函数和包含调用,常量等等 . 您不能将它添加到函数或类定义或条件结构(如if和foreach等)之前 .

    Warning:-

    目前是“@”错误控制运算符前缀甚至会针对将终止脚本执行的关键错误禁用错误报告 . 除此之外,这意味着如果你使用“@”来抑制来自某个函数的错误,并且它不可用或者输入错误,那么脚本就会在那里死亡而没有任何关于原因的指示 .

  • 205

    可能值得添加这里有一些指针在使用@时你应该知道,对于一个完整的向下看这篇文章:http://mstd.eu/index.php/2016/06/30/php-rapid-fire-what-is-the-symbol-used-for-in-php/

    • 即使前缀为@符号,错误处理程序仍会被触发,它只是意味着设置了错误级别0,这必须在自定义错误处理程序中正确处理 .

    • 使用@预先包含include会将包含文件中的所有错误设置为错误级别0

  • 57

    @ 禁止该函数抛出的错误消息 . fopen 在文件未退出时抛出错误 . 即使文件不存在, @ 符号也会使执行移动到下一行 . 我建议在开发PHP代码时不要在本地环境中使用它 .

相关问题