使用isset或@来测试/分配超全局变量

时间:2013-05-22 17:45:03

标签: php isset superglobals

我可以使用@代替isset来分配或测试超全局变量吗?

使用此:

$foo = intval(@$_POST['bar']);

而不是:

$foo = isset($_POST['bar']) ? intval($_POST['bar']) : 0;

在没有生成通知的情况下工作,但可能由于某些原因,isset的使用优于@

2 个答案:

答案 0 :(得分:2)

使用三元运算符的

isset将更清晰,更易于阅读。 另一方面,错误抑制有一些开销成本:

  

我首先构建了一个简单的测试,可以循环访问一百万次   带有和不带抑制运算符的变量。该   差异很小,但很明显。使用抑制运算符   最终执行时间延长了40%。

来源:

http://seanmonstar.com/post/909029460/php-error-suppression-performance http://www.lunawebs.com/blog/2010/06/07/another-look-at-php-error-supression-performance/

答案 1 :(得分:2)

对于那些厌倦了在拉取值之前使用isset()的人,可以使用 @ 的替代方法:

function iisset(&$var, $default = null) {
     return isset($var) ? $var : $default;
}

没有生成通知将不存在的数组索引作为引用传递。因此,对于您的示例,您将使用:

$foo = intval(iisset($_POST['bar'], 0));

我希望PHP有一个像这样内置的功能。 isset 检查的数量随后立即检索到该数组索引是如此常见,以至于没有像这样的函数会有大量的额外代码。

<强>更新

PHP 7现在有一个内置运算符,称为null coalesce operator

$foo = intval($_POST['bar'] ?? 0);