【问题标题】:What does the '@' prefix do in PHP? [duplicate]'@' 前缀在 PHP 中的作用是什么? [复制]
【发布时间】:2011-06-06 21:42:14
【问题描述】:

以下代码中的“@”符号有什么作用?

@mkdir(ROOT. "cache/");

【问题讨论】:

标签: php prefix


【解决方案1】:

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

错误抑制是一种让函数按照你需要的方式运行的快速而肮脏的方法,因为在 web 开发中你无法预测会发生什么,有时它不值得关心!

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

这样做:

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

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

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

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

【讨论】:

  • 启用 PHP 通知后,我认为@suppressor 变得非常有用,即: if( @$_POST['submit'] == 'send' ){}
  • “可能有一些优雅的方法可以做到这一点,但说真的,我不在乎!”我希望我永远不会碰你的代码。
  • 我真的很喜欢这个答案。我对 PHP 很陌生,很容易意外生成您不希望用户看到的错误。这个运算符似乎很容易解决。
  • “很容易意外生成您不希望用户看到的错误”
  • 对不起,试图说“很容易意外生成您不希望用户看到的错误”不是使用@的原因。您仍然需要对这种情况负责。
【解决方案2】:

正如所指出的,它是错误抑制算子。

但没有指出的是,使用这种做法是非常糟糕的做法 - 错误不应默默失败。

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

具体例子中……

@mkdir(ROOT. "cache/");

...它忽略来自mkdir() 的任何错误。 docs 表示它在失败时返回 FALSE,所以你应该这样做......

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

【讨论】:

    【解决方案3】:

    It suppresses errors from displaying:

    PHP 支持一种错误控制运算符:at 符号 (@)。当附加到 PHP 中的表达式时,该表达式可能生成的任何错误消息都将被忽略。

    如果启用了 track_errors 功能,则表达式生成的任何错误消息都将保存在变量 $php_errormsg 中。这个变量会在每次错误时被覆盖,所以如果你想使用它,请尽早检查。

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

    【讨论】:

    • 感谢您的回答。这只会让我继承的恶心代码比我想象的还要糟糕!
    • 因为调试起来很困难,所以尽量避免使用这个特性,尤其是在关键代码上。
    • 如果您打算抑制错误,最好使用error_reporting(0);,原因有两个:A. 更快,B. 以后更容易更改。
    • +1 就像其他语言(例如,C)一样,向您发出警告或通知是有原因的。它们不应该被忽视,而是相应地处理。
    • 在循环中使用@时要小心:每次运行都会触发error_reporting()两次。通常最好在循环之前禁用错误,然后在循环完成后重置错误级别。
    猜你喜欢
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 2016-04-15
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    相关资源
    最近更新 更多