哪个慢?错误抑制还是专用功能?

时间:2010-10-14 20:04:52

标签: php

拿这个:

$data = array('one'=>'1','three'=>'3');

现在哪个更好? 这样:

echo @$data['two'];

或者这个:

function val($data,$key,$default){
  if(isset($data[$key])){
    return $data[$key];
  }
  return $default;
}
echo val($data,'two','');

或者这个:

echo isset($data['two'])?$data['two']:'';

还是其他什么?

避免通知:注意:未定义的索引:文档中的两个#num

哪一个效率最高,我应该使用哪一个? 我想知道可能超缓慢的错误抑制可能比拥有专用函数更快?

P.S。很多答案似乎都假设我这样做是一种优化形式,这不是真的,我在好奇心和“我应该使用哪一部分”中要求“效率”部分,因为我需要使用一些东西而我我想知道我应该默认的内容。

p.p.s。效率最高,使用最有可能是不同的

6 个答案:

答案 0 :(得分:4)

使用您最喜欢的。应用程序的缓慢不是来自这个地方。

答案 1 :(得分:1)

来自java,我建议你使用第三个选项。这样,您就不会隐藏不起作用的代码,而是在没有代码时提供默认值。

第一种方法只是隐藏错误,第二种方式太长了。

答案 2 :(得分:1)

知道@的错误抑制非常慢。我已经读过,转发错误报告,执行某些操作然后转换旧报告级别仍然比仅使用@更快。

关于其他两个选项 - 它们对我来说是相同的,但只是输出,我会使用isset的第3个变体 - 只是看起来更好,不需要定义额外的功能......如果你使用了大量的输出 - 那么也许函数会减少代码重复,并且会更有用......

答案 3 :(得分:1)

这是常识性答案

“@”符号将禁止PHP生成的错误消息。抑制,通知将发生,并将调用错误处理函数。

isset是语言构造的一部分,因此速度更快。

使用三元运算符isset($dat['index']) ? $data['index'] : null,因为它看起来很干净并且不会触发错误处理

答案 4 :(得分:1)

Php有这个array_key_exists函数,我认为这是处理你正在做的事情最正确的方法。至于速度,这是我刚刚制作的测试程序:

//testing @
$t = microtime(TRUE);

$a = array('one' => 1, 'three' => 3);

for ($i = 0; $i < 1000000; $i++)
  $b = @$a['two'];

echo (microtime(TRUE) - $t)."\n";


//testing array_key_exists
$t = microtime(TRUE);

$a = array('one' => 1, 'three' => 3);

for ($i = 0; $i < 1000000; $i++)
  $b = array_key_exists('two', $a) ? $a['two'] : '';

echo (microtime(TRUE) - $t)."\n";


//testing isset
$t = microtime(TRUE);

$a = array('one' => 1, 'three' => 3);

for ($i = 0; $i < 1000000; $i++)
  $b = isset($a['two']) ? $a['two'] : '';

echo (microtime(TRUE) - $t)."\n";

结果是:

5.9005348682404
9.6285729408264
0.32760310173035

所以是的,isset显然更快。

答案 5 :(得分:0)

时间过去了,对解决方案的反思

  • Q值。我应该默认使用哪个?
  • 甲。三元运营商。

  • Q值。哪个最快?
  • 甲。三元运营商。

  • Q值。哪个最方便?
  • 甲。自定义功能。

@ error surpressing实际上就像这样

  1. 它完全关闭整个php线程的错误报告
  2. 执行操作
  3. 它会重新开启错误报告
  4. 这就是不推荐的原因

    有时候我会用它:

    function issetor(&$variable, $or = NULL) {
      return $variable === NULL ? $or : $variable;
    }
    

    因为写的时间更短:

    echo issetor($data['two'],'');
    

    比:

    echo isset($data['two'])?$data['two']:'';
    

    警告:如果issetor($arr[$k],null);尚未设置,$arr[$k] = null;将设置$arr[$k]

    其他时候我使用自定义数组处理函数,具体取决于具体情况。