代码之家  ›  专栏  ›  技术社区  ›  Timo Huovinen

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

php
  •  0
  • Timo Huovinen  · 技术社区  · 14 年前

    $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、 很多答案似乎认为我这样做是一种优化,这不是真的,我问“效率”部分是出于好奇,问“我应该使用哪个”部分是因为我需要使用一些东西,我想知道我应该默认什么。

    p、 p.s.最有效,使用的可能不同

    6 回复  |  直到 7 年前
        1
  •  1
  •   Alex    14 年前

    这是常识性的回答

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

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

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

        2
  •  4
  •   Vilx-    14 年前

    用你最喜欢的。你申请的慢不是来自这个地方。

        3
  •  1
  •   Colin Hebert    14 年前

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

        4
  •  1
  •   Laimoncijus    14 年前

    @ 知道要慢一点。我已经读过了,把错误报告,做一些事情,然后把旧的报告级别转换,仍然比仅仅使用 @

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

        5
  •  1
  •   cambraca    14 年前

    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明显更快。

        6
  •  0
  •   Timo Huovinen    11 年前

    • Q、 默认情况下应该使用哪个?
    • A、 三元运算符。

    • Q、 哪个最快?
    • A、 三元运算符。

    • A、 自定义函数。

    @错误补偿实际上是这样工作的

    1. 它完全关闭整个php线程的错误报告
    2. 它做手术
    3. 它将错误报告切换回

    有时我用这个:

    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] 尚未设置

    其他时候,我会根据情况使用自定义数组处理函数。