在PHP中,@前缀做什么?

What does the '@' prefix do in PHP?

本问题已经有最佳答案,请猛点这里访问。

"@"符号在以下代码中的作用是什么?

1
@mkdir(ROOT."cache/");


它禁止错误显示:

PHP supports one error control operator: the at sign (@). When prepended to an expression in PHP, any error messages that might be generated by that expression will be ignored.

If the track_errors feature is enabled, any error message generated by the expression will be saved in the variable $php_errormsg. This variable will be overwritten on each error, so check early if you want to use it.

正如注释中所指出的,我也无法想象实际使用此功能的原因——编写适当处理错误状态/条件的代码。


如前所述,它是错误抑制运算符。

但还没有指出的是,使用错误的做法是非常糟糕的——错误不应该一声不响地失败。

检查错误返回,并在使用异常的地方使用try/catch块。

在具体的例子中…

1
@mkdir(ROOT."cache/");

…它忽略了mkdir()的任何错误。医生说它失败后会返回FALSE,所以你应该……

1
2
3
if ( ! mkdir(ROOT."cache/")) {
   // Handle error.
}


人们似乎忘记了PHP是一种快速完成任务的肮脏语言,直到最近它才试图变得成熟和成熟。

错误抑制是一种快速而肮脏的方法,可以使函数按照您需要的方式运行,因为在Web开发中,您无法预测将向您抛出什么,有时它不值得关心!

一个典型的例子是有用的函数getImageSize,它允许您获取有关某人上载的图像的一些信息。如果图像文件不是标准图像文件,则此函数将不稳定地夹住。它不是真正的开发者角色来检查一个文件,确定它是否可以加载到getImageSize中。也许有优雅的方式,但说真的,我不在乎!

只要这样做:

1
2
3
4
5
6
if( !($a = @getimagesize(  $_FILE['file']['tmp_name'] )))
{
   unlink( $_FILE['file']['tmp_name'] );

   //politely tell user that you rejected their image!
}

是的,您可以使用更加优雅的try-and-catch语句,但最后,您捕获了错误并抑制了错误消息,这是您想要的,而不需要使用tab键!

与上述答案相反,仔细使用的@前缀不会导致火车失控。它只允许开发人员以他们喜欢的方式来适应错误。