PHP中@符号的用法是什么?
我在某些函数的前面看过@
用法,如下所示:
$fileHandle = @fopen($fileName, $writeAttributes);
这个符号有什么用?
它抑制错误消息 – 请参阅PHP手册中的错误控制操作符 。
它抑制了错误。
请参阅手册中的错误控制操作员 :
PHP支持一个错误控制运算符:at符号(@)。 当在PHP中添加expression式时,可能会由该expression式生成的任何错误消息都将被忽略。
如果你用set_error_handler()函数设置了一个自定义的error handling函数,那么它仍然会被调用,但是这个自定义error handling函数可以(也应该)调用error_reporting() ,当触发错误的调用前面有一个@ …
@
符号是错误控制操作符 (AKA是“静音”或“闭嘴”操作符)。 它使得PHP能够抑制由关联expression式生成的任何错误消息(通知,警告,致命等)。 它就像一个一元运算符一样工作。 例如,它具有优先级和相关性。 以下是一些例子:
@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".
如果使用自定义error handling程序而不是标准的PHPerror handling程序,会发生什么情况:
如果你用set_error_handler()函数设置了一个自定义的error handling函数,那么它仍然会被调用,但是这个自定义error handling函数可以(也应该)调用error_reporting(),当触发错误的调用前面有一个@ 。
下面的代码示例说明了这一点:
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"
error handling程序没有检查@
符号是否有效。 手册build议如下:
function better_error_handler($errno, $errstr, $errfile, $errline, $errcontext) { if (error_reporting() !== 0) { echo "[better_error_handler]: $errstr"; } // Take appropriate action return true; }
另外请注意,尽pipe隐藏了错误,但任何自定义error handling程序( set_error_handler
设置)仍将被执行!
就像之前的一些回答一样: @
运算符可以抑制PHP中的所有错误,包括通知,警告甚至严重错误。
但是: 请确实不要使用@
操作符。
为什么?
那么,因为当你使用@
运算符进行错误抑制的时候,当发生错误时,你不知道从哪里开始。 对于一些开发人员经常使用@
运算符的遗留代码,我已经有了一些“乐趣”。 尤其是在文件操作,networking调用等情况下,这些都是很多开发人员推荐使用@
操作符的情况,因为这里有一个错误发生时有时超出范围(例如,第三方API可能无法访问等) )。
但是,还有什么地方不使用它? 我们从两个angular度来看看:
作为开发人员:当使用@
,我完全不知道从哪里开始。 如果有数百个甚至上千个带@
的函数调用,那么这个错误可能就像everyhwere一样。 在这种情况下没有合理的debugging可能。 即使这只是一个第三方的错误 – 那么它就很好,你做得很快。 ;-)另外,最好在错误日志中添加足够的细节,以便开发人员能够轻松决定日志条目是否必须进一步检查,或者只是第三方失败超出了开发者的范围。
作为用户:用户根本不关心错误的原因是什么。 软件是为了他们的工作,完成一个特定的任务等,他们不在乎,如果这是开发商的错误或第三方的问题。 特别是对于用户,我强烈build议logging所有的错误,即使它们超出了范围。 也许你会注意到一个特定的API经常离线。 你能做什么? 您可以与您的API合作伙伴交谈,如果他们无法保持稳定,您应该寻找其他合作伙伴。
简而言之:你应该知道存在像@
这样的东西(知识永远是好的),但是不要使用它 。 许多开发人员(特别是那些从别人那里debugging代码的人)将非常感激。
如果打开失败,则会生成E_WARNING级别的错误。 你可以用@来压制这个警告。
假设我们没有使用“@”运算符,那么我们的代码将如下所示:
$fileHandle = fopen($fileName, $writeAttributes);
而如果我们试图打开的文件没有find? 它会显示一条错误消息。
为了抑制错误消息,我们使用“@”运算符:
$fileHandle = @fopen($fileName, $writeAttributes);
“@”禁止错误消息。
它用在代码片段中,如:
@file_get_contents('http://www.exaple.com');
如果域“ http://www.exaple.com ”不可访问,则会显示错误,但使用“@”则不显示任何内容。
PHP支持一个错误控制运算符:at符号(@)
。 当在PHP中添加expression式时,可能会由该expression式生成的任何错误消息都将被忽略。
如果你用set_error_handler()
函数设置了一个自定义的error handling函数,那么它仍然会被调用,但是这个自定义error handling函数可以(也应该)调用error_reporting()
,当触发错误的调用前面有一个@
。
<?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. ?>
注意:-
1)@ -operator只能用于expression式。
2)一个简单的经验法则是:如果你可以采取某些东西的价值,你可以预先@运算符。 例如,你可以把它加到variables,函数和包含调用,常量等等。 您不能将它预先添加到函数或类定义,或if和foreach等条件结构中,等等。
警告:-
目前,“@”错误控制操作符前缀将甚至禁用将终止脚本执行的严重错误的错误报告。 除此之外,这意味着如果您使用“@”来抑制来自某个函数的错误,并且该错误不可用或者错误input,那么脚本就会在那里死亡,而不会显示原因。
这里可能值得加上一些使用@你应该知道的一些指针,为完整的运行查看这篇文章: http : //mstd.eu/index.php/2016/06/30/php-速射-什么-是最符号用来换的,PHP /
-
即使使用了@符号,error handling程序仍然被触发,它只是意味着设置了错误级别0,这将必须在自定义error handling程序中正确处理。
-
在@之前加上include将会把包含文件中的所有错误设置为错误级别0