As a developer: 当使用 @ 时,我完全不知道从哪里开始 . 如果有 @ 的数百甚至数千个函数调用,则错误可能就像每个人一样 . 在这种情况下,无法进行合理的调试即使它只是一个第三方错误 - 然后它快速完成了's just fine and you' . ;-)而且,它只是一个超出开发人员范围的第三方失败 .
As a user: 如果_849240错误或第三方问题,用户请小心 . 特别是对于用户,我强烈建议记录所有错误,即使他们发现特定的API经常脱机也是如此 . 你能做什么?您可以与您的API合作伙伴交谈,如果他们无法保持稳定,您应该寻找其他合作伙伴 .
In short: 你应该知道存在像 @ (知识总是好的),但只是 do not use it . 许多开发人员(尤其是那些调试其他代码的开发人员)将非常感激 .
<?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.
?>
11 回答
它会抑制错误消息 - 请参阅PHP手册中的Error Control Operators .
它可以抑制错误 .
请参阅手册中的Error Control Operators:
@
符号是error control operator(又名"silence"或"shut-up"运算符) . 它使PHP抑制由关联表达式生成的任何错误消息(通知,警告,致命等) . 它就像一元运算符一样工作,例如,它具有优先级和关联性 . 以下是一些例子:如果您使用自定义错误处理程序而不是标准PHP错误处理程序,会发生什么:
以下代码示例说明了这一点:
错误处理程序未检查
@
符号是否生效 . 手册建议如下:另请注意,尽管隐藏了错误,仍将执行任何自定义错误处理程序(使用
set_error_handler
设置)!就像之前已经回答的那样:
@
运算符可以抑制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 . 许多开发人员(尤其是那些调试其他代码的开发人员)将非常感激 .假设我们没有使用“@”运算符,那么我们的代码将如下所示:
如果找不到我们试图打开的文件怎么办?它将显示错误消息 .
要取消错误消息,我们使用“@”运算符,如:
如果打开失败,则会生成级别为E_WARNING的错误 . 您可以使用@来禁止此警告 .
@
禁止错误消息 .它用于以下代码片段:
如果无法访问域“http://www.exaple.com”,则会显示错误,但是
@
未显示任何内容 .PHP支持一个错误控制操作符:at符号
(@)
. 当在PHP中添加表达式之前,将忽略该表达式可能生成的任何错误消息 .如果您使用
set_error_handler()
设置了自定义错误处理函数,那么它仍然会被调用,但是这个自定义错误处理程序可以(并且应该)调用error_reporting()
,当触发错误的调用前面有@
时,它将返回0
.Note:-
1)@ -operator仅适用于表达式 .
2)一个简单的经验法则是:如果你可以获取某些东西的值,你可以在它前面添加@运算符 . 例如,您可以将它添加到变量,函数和包含调用,常量等等 . 您不能将它添加到函数或类定义或条件结构(如if和foreach等)之前 .
Warning:-
可能值得添加这里有一些指针在使用@时你应该知道,对于一个完整的向下看这篇文章:http://mstd.eu/index.php/2016/06/30/php-rapid-fire-what-is-the-symbol-used-for-in-php/
即使前缀为@符号,错误处理程序仍会被触发,它只是意味着设置了错误级别0,这必须在自定义错误处理程序中正确处理 .
使用@预先包含include会将包含文件中的所有错误设置为错误级别0
@
禁止该函数抛出的错误消息 .fopen
在文件未退出时抛出错误 . 即使文件不存在,@
符号也会使执行移动到下一行 . 我建议在开发PHP代码时不要在本地环境中使用它 .