以下代码中的“@”符号有什么作用?
@mkdir(ROOT. "cache/");
PHP 支持一种错误控制运算符:at 符号 (@)。当附加到 PHP 中的表达式时,该表达式可能生成的任何错误消息都将被忽略。
如果启用了 track_errors 功能,则表达式生成的任何错误消息都将保存在变量 $php_errormsg 中。这个变量将在每个错误上被覆盖,所以如果你想使用它,请尽早检查。
正如评论中所指出的,我也无法想象实际使用此功能的理由——编写适当处理错误状态/条件的代码。
正如所指出的,它是错误抑制算子。
但是没有被指出的是,使用它是非常糟糕的做法 - 错误不应该默默地失败。
检查错误返回,并在使用异常的地方使用 try/catch 块。
在具体的例子中...
@mkdir(ROOT. "cache/");
...它忽略来自mkdir()
. 文档说它会在失败时返回,FALSE
所以你应该这样做......
if ( ! mkdir(ROOT. "cache/")) {
// Handle error.
}
人们似乎忘记了 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 键!
与上述答案相反,谨慎使用的 @ 前缀不会导致失控的火车失事。它只是允许开发人员以他们喜欢的方式容纳错误。