在这种情况下,我可以使用@来避免无用的isset()吗?

时间:2012-03-03 16:37:32

标签: php

基本上我需要用$_GET['param']创建一个字符串,如:

$myString = $_GET['param'] . 'abc';

如果$_GET['param']未设置,我$myString只是='abc'

完全没问题
  • 所以我可以这样做:

    $myString = @$_GET['param'] . 'abc';
    
  • 或者使用isset的标准方式:

    if (!isset($_GET['param']))
       $_GET['param'] = '';
    
    $myString = $_GET['param'] . 'abc';
    

在这种情况下使用@抑制器正在考虑这样糟糕的实践?

3 个答案:

答案 0 :(得分:5)

恕我直言最优雅的东西是用一个漂亮的getter函数来包装它,比如:

function _getParam($param, $default = '') {
    if (!isset($_GET[$param]))
       return $default;
    return $_GET[$param];

}


$myString = _getParam('param').'abc';

是123注意:
正如dvir所说,在框架中为输入变量设置getter函数非常方便。但是这个_getParam遇到了这个问题:

让我们看看我们在代码中输入错字,我们想访问$_GET['param']而不是我们输入的内容:

_getParam('parm')

我们的代码可以在不产生任何问题的情况下工作,我们很难找到错误。

所以我认为我们可以修改呈现的功能:

function _get() {
  $key = func_get_arg(0);

  if (func_num_args()==2) {
    if (!isset($_GET[$key]))
      return func_get_arg(1);  
  }

  return $_GET[$key];
}

这确保了当我们使用_get('parm')输入错误时,我们会收到正常通知。但是当我们使用2个参数时,我们得出默认值:

_get('param','myDefaultValue');

答案 1 :(得分:3)

您可以避免像这样使用@

$myString = ( isset($_GET['param']) ? $_GET['param'] : '' ) . 'abc';

  

在这种情况下使用@suppresser正在考虑这么糟糕的实践?

通常从开发人员的角度来看,最好避免使用@运算符,因为它可能会隐藏在调试特定问题时可能有用的错误。除此之外,它非常缓慢,因此,在未来的PHP版本中,@ won't be supported in ini_set calls

答案 2 :(得分:0)

在我看来,这并不是非常优雅(尽管 简短)。我认为你在这里遇到的最糟糕的事情可能就是用你的“标准”方法直接写入$_GET超全球。

if (!isset($_GET['param'])) $_GET['param'] = '';

也许我是偏执狂,但是之后检查isset($_GET['param'])的另一个不相关的脚本可以运行,现在它会返回TRUE,因为你已经注入了''

所以,是的 - 你可以在这里安全地使用错误抑制(你不会错过很多),但没有理由避免isset()

$myString = isset($_GET['param']) ? $_GET['param'] : '' . 'abc';