给我一个很好的理由来做这个
if( isset($_GET['key']) && ($_GET['key'] === '123') )
{...
而不是
if( @$_GET['key'] === '123' )
{...
我要求这个非常具体的代码案例,而不是一般的!
不欢迎以下原因:
@
会使应用程序减慢几纳秒,因为
无论如何都会产生错误(即使它被压制了)。“嗯,我更喜欢慢
代码但更具可读性。@
是一个坏习惯。”一般来说可能是真的,但在这种情况下我不相信(而且坏习惯可能
取决于上下文,在PHP手册的功能,如fopen
他们
建议在某些情况下使用@
,请参阅错误/例外
在http://www.php.net/manual/en/function.fopen.php)答案 0 :(得分:4)
性能影响实际上并不是针对此示例的最佳参数,您必须在自己的应用程序中测量性能以确定这是否是一个问题。如果未设置大量正在检查的项目,或者您在循环中放置了诸如此类的检查,则更有可能导致速度变慢。
与使用@
运算符相关的主要问题是它很可能成为代码中的约定,因此虽然您的示例可能看似无害,但您可能会在以后发现自己或您的团队使用:
if( @IsAvailable() ) {
错误抑制开始隐藏您没想到的真实错误以及您所做的错误 - 并且您根本不知道发生了什么,因为您根本没有获得异常信息。
答案 1 :(得分:1)
想想当您的网站/应用程序每天开始收到数十/数十万(或更多)请求时,您的应用程序速度会降低多少。如果您将错误视为标准,那么每个请求可能有几十个 - 突然之间,您的网站明显比您希望的要慢。
除此之外,您最终还是可以抑制在开发过程中您真正想要了解的错误。
答案 2 :(得分:0)
如果你不把性能问题作为参数,那么确实没问题。但它并非必须在所有情况下,因为@会压制所有可能的错误,即使是那些你没想过的错误。但在这种情况下,似乎没有其他错误可以让你想要压制。
我同意你之前在读取值之前的isset()非常难看,我也不喜欢写它。但是插入@ before语句看起来很丑陋。它会降低更长代码的可读性。
好消息是,从PHP 7开始,我们可以使用更好的方法,null-coalescence运算符 ?? ,其工作原理如下:
if($_GET['key'] ?? '' === '123' ) {}
它基本上是替代它:
$result = isset($value) ? $value : $anotherValue;
现在可以使用
$result = $value ?? $anotherValue;