at符号用于隐藏错误消息。据我所知,绝对没有使用它的用例或借口。
我的一位朋友花了几个小时试图找出软件在一个系统上工作而不在另一个系统上工作的原因。如果库开发人员不使用@ -sign,那么这将花费大约10秒。
当我说@ -sign完全没有价值时,我是否心胸狭窄,是否有有效案例?
答案 0 :(得分:4)
@符号有一些价值,但它通常是代码味道。
请考虑以下事项:您正在开发一个需要与多个项目兼容的库,并且您不希望全局更改错误处理程序。不幸的是,许多PHP函数(包括套接字和流相关的函数)抛出PHP错误而不是失败时的异常。 " @"当然,只有当错误被手动检查时才会隐藏错误,并且如果发生错误则抛出异常。
它对文件系统操作也很有用
主要是你是对的......这通常是可怕的做法(:
答案 1 :(得分:3)
有一些罕见的情况,使用错误抑制确实有意义。
其中一个是原子文件系统操作。例如。而不是写作
if (file_exists($fileName)) {
unlink($fileName);
}
你刚刚做了
@unlink($fileName);
这可确保您的代码不受竞争条件的限制。
通常@
在 PHP为函数选择不适当的错误模型的情况下非常有用。上述unlink
函数就是这样一个例子。类似地,还有其他函数,其中PHP抛出错误,即使它不应该(而是使用返回值或可捕获的异常)。
答案 2 :(得分:1)
在大多数情况下,你确实不应该使用它。有些情况下它有意义:
unlink()
while (@ob_end_flush());
可能还有其他一些边缘情况,但除此之外你应该永远不会产生错误。
答案 3 :(得分:0)
与可用的所有工具(编程及其外部)一样,所有工具都有合法的用例。
错误抑制运算符的第一个例子就像是
if (!@unlink($file)) {
// I am already handling the error. I don't care what caused it.
// Even NOT handling this case at all could be a legitimate reaction
// depending on circumstances.
}
答案 4 :(得分:0)
DOMDocument
时,无效的HTML会发出警告,我们不关心大多数情况。Mail
时,您会收到有关不应静态调用的函数的警告,因为Mail
支持PHP 4.这些可以安全地忽略。unlink()
时,可以抑制错误以防止竞争条件。答案 5 :(得分:0)
我看到它最常用的地方是在使用db时抑制mysql错误。然后,用户检查响应,并输出相应的错误消息。
实施例
<?php
$link = @mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($link);
?>
我也看到过在使用ftps和sftps时使用它。
但我同意你的看法,我觉得它的用途有限。如果最终出现需要在自己生成的代码中使用@ -sign的情况,我认为是时候重新考虑解决方案了。