'@'前缀在PHP中有什么作用?

Ric*_*ner 31 php prefix

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

@mkdir(ROOT. "cache/");
Run Code Online (Sandbox Code Playgroud)

Mar*_*iot 40

它可以抑制显示的错误:

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

如果启用了track_errors功能,则表达式生成的任何错误消息都将保存在变量$ php_errormsg中.此变量将在每个错误上被覆盖,因此如果要使用它,请提前检查.

正如评论中所指出的,我也无法想象实际使用此功能的理由 - 编写适当处理错误状态/条件的代码.

  • 在循环中使用 @ 时要小心:每次运行都会触发 `error_reporting()` 两次。通常最好在循环之前禁用错误,然后在循环完成后重置错误级别。 (2认同)

ale*_*lex 8

正如所指出的,它是错误抑制操作符.

但是没有指出的是,使用它是非常糟糕的做法 - 错误不应该无声地失败.

检查错误返回,并使用正在使用异常的try/catch块.

在具体的例子中......

@mkdir(ROOT. "cache/");
Run Code Online (Sandbox Code Playgroud)

......它忽略了任何错误mkdir().该文件说,它返回FALSE失败,所以你应该做的......

if ( ! mkdir(ROOT. "cache/")) {
   // Handle error.
}
Run Code Online (Sandbox Code Playgroud)


Gor*_*use 5

人们似乎忘记了PHP是一种用于完成工作的快速脏语言,直到最近才尝试成熟和复杂.

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

一个典型的例子是有用的功能getimagesize,它允许您获取有关某人已上传的图像的一些信息.如果图像文件不是标准图像文件,则此功能会抖动.检查文件并确定它是否可以加载到getimagesize中并不是开发人员的角色.可能有优雅的方式来做到这一点,但严重的是我不在乎!

这样做:

if( !($a = @getimagesize(  $_FILE['file']['tmp_name'] )))
{
   unlink( $_FILE['file']['tmp_name'] );

   //politely tell user that you rejected their image!
}
Run Code Online (Sandbox Code Playgroud)

是的,您可以使用更优雅的try和catch语句,但最后,您已经捕获了错误并抑制了错误消息,这就是您想要的而不会破坏标签键!

与上述答案所说的相反,小心使用的@前缀不会导致失控的火车残骸.它只允许开发人员以他们喜欢的方式容纳错误.