是设置默认值的错误处理安全的elvis运算符吗?

时间:2016-01-13 08:18:47

标签: php

如果变量为空,我的代码中的

通常使用if(!isset())来设置默认值 例如:

if(isset($_POST['noreg']))
{
 $noreg = $_POST['noreg'];
}
else
{
$noreg = 'empty';
}

我的朋友建议我使用带错误处理的elvis操作符,它看起来比以前缩短了,

$noreg = @$_POST['noreg'] ?: 'empty';

它像我的旧代码一样工作正常

但如果我使用它是否安全或有任何风险?

任何人都可以帮助我吗? 感谢

2 个答案:

答案 0 :(得分:2)

@运算符会抑制错误报告。这意味着仍然会产生错误,但它正在沉默。这有三个原因:

  1. 提出然后丢弃错误可能比isset检查更慢。
  2. 如果您有自定义错误处理程序,该处理程序可能会忽略@并仍然会产生错误。
  3. 您不知道您可能会抑制哪些其他类型的错误,而这些错误并不是您所期望的。
  4. 特别是,如果你不小心写了@$_PSOT['noreg']怎么办? PHP的错误报告不会提醒您这个错误,而且你处于黑暗中。如果您使用filter_input(INPUT_POST, 'noreg')array_key_exists('noreg', $_POST),则无法进行此类错误。

    (这个例子可能有点人为,因为isset()会抑制相同的错误,但这是为了说明使用错误抑制的缺陷以及为什么一个人必须非常清醒它。)

答案 1 :(得分:1)

如果您将它用于简单的变量初始化,那么它没问题。它适用于任何表达和&在它之前,它将抑制错误。

直接来自文档http://php.net/manual/en/language.operators.errorcontrol.php

  

PHP支持一个错误控制操作符:at符号(@)。什么时候   预先附加到PHP中的表达式,可能是任何错误消息   由 expression 生成的内容将被忽略。

     

如果您已设置自定义错误处理函数    set_error_handler() 然后仍会被调用,但这个自定义   错误处理程序可以(并且应该)调用error_reporting()   当触发错误的调用前面有@。

时返回0      

目前" @"错误控制运营商前缀甚至会禁用   错误报告将终止脚本的严重错误   执行。除此之外,这意味着如果你使用" @"至   抑制某个功能的错误,并且它不可用   或者错误输入,脚本将在那里死亡   指示为什么。