2016-01-13 61 views
0

在我的代码通常使用if(!isset())为设定的默认值,如果变量为空 例如:是elvis操作员,错误处理对于设置默认值是否安全?

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

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

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

正常工作像我的旧代码

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

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

+1

较短的ISN不一定更好。只需坚持'$ noreg = isset($ _ POST ['noreg'])? $ _POST ['noreg']:'空';' – Kalzem

回答

2

@运营商抑制错误报告。这意味着仍然有一个错误正在产生,但它正在沉默。这是有问题的三个原因:

  1. 它可能会慢慢升起,然后丢弃错误比isset检查会。
  2. 如果您有自定义错误处理程序,该处理程序可能会忽略@并仍然会产生错误。
  3. 你不知道还有什么其他类型的错误,你可能会压制,你不期望。

特别是,如果你不小心写了@$_PSOT['noreg']? PHP的错误报告不会提醒你这个错误,而你处于黑暗中。如果您使用filter_input(INPUT_POST, 'noreg')array_key_exists('noreg', $_POST),则无法执行此类错误。

(这个例子可能有点做作,因为isset()将打压同样的错误,但它说明使用错误抑制的陷阱,为什么人们必须非常清楚这一点。)

1

如果你使用它进行简单变量初始化,那就没问题。它会在前面的任何表达式&上工作,它会抑制错误。

直从文档http://php.net/manual/en/language.operators.errorcontrol.php

PHP支持一个错误控制操作者:所述符号(@)。当前缀 到PHP中的表达式时,将会忽略由该expression生成的可能为 的任何错误消息。

如果已设置与 set_error_handler()然后自定义错误处理函数就会仍然可以称为,但这个习俗 错误处理程序可以(也应该)调用使用error_reporting(),这将 返回0时调用触发错误的前面是@。

目前,“@”错误控制运算符前缀将甚至禁用 关键错误的错误报告,该错误报告将终止执行脚本 。除此之外,这意味着如果您使用“@”来拒绝来自某个功能的错误,并且它不可用 或者输入错误,那么该脚本将在那里死亡,而没有 指示为什么。

+0

如果我继续使用它,那么没有什么不好的事情会发生? –

+0

@AKohar它取决于情况,如果你用于简单的目的,那么没关系。 –