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


Using isset or @ to test/assign a superglobal variable

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

使用:

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

而不是:

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

不产生通知,但可能由于某些原因,isset的使用比@好?

isset使用三元操作符将更清晰,更易于阅读。另一方面,错误抑制有一些开销:

我首先构建了一个简单的测试,它将循环一百万次访问带或不带抑制运算符的变量。的差异很小,但很明显。使用抑制算子结果执行时间增加了40%。

来源:

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

对于那些厌倦了在提取值之前使用isset()的人来说,还有一种替代方法可以使用@:

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

传递不存在的数组索引作为引用时不会生成通知。例如,你可以使用:

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

我希望PHP有一个这样的内置函数。大量的isset检查之后立即检索数组索引是如此普遍,如果没有这样的函数,就会有大量的额外代码。

更新:

PHP 7现在有一个内置的空合并操作符:

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