PHP @而不是isset来测试$ _GET值

时间:2013-02-22 15:23:19

标签: php get isset error-suppression

给我一​​个很好的理由来做这个

if( isset($_GET['key']) && ($_GET['key'] === '123') )
{...

而不是

if( @$_GET['key'] === '123' )
{...

我要求这个非常具体的代码案例,而不是一般的!

不欢迎以下原因:

  • 使用@会使应用程序减慢几纳秒,因为 无论如何都会产生错误(即使它被压制了)。“嗯,我更喜欢慢 代码但更具可读性。
  • 使用@是一个坏习惯。”一般来说可能是真的,但在这种情况下我不相信(而且坏习惯可能 取决于上下文,在PHP手册的功能,如fopen他们 建议在某些情况下使用@,请参阅错误/例外 在http://www.php.net/manual/en/function.fopen.php

3 个答案:

答案 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;