【问题标题】:PHP - extract() typePHP - extract() 类型
【发布时间】:2010-11-12 04:49:24
【问题描述】:

PHP 的extract() 函数可以采用多个extract_types 之一。但是extr_prefix_sameextr_prefix_if_exists 之间有什么区别?手册听起来像是,在任何一种情况下,如果变量名称已经存在,则新变量将作为前缀。

谢谢!

【问题讨论】:

    标签: php extract exists prefix


    【解决方案1】:

    当使用EXTR_PREFIX_IF_EXISTS 时,如果变量不存在,那么前缀版本也不会被创建。在这个例子中:

    function test() {
        $a = 12345;
    
        extract(array('a' => 1, 'b' => 2, 'c' => 3), EXTR_PREFIX_IF_EXISTS, 'my_');
    
        var_export(get_defined_vars());
    }
    test();
    

    $my_b$my_c 未创建,因为 $b$c 不存在。

    【讨论】:

    • 非常感谢!阅读速度太快,错过了与EXTR_IF_EXISTS 的连接。现在完全有道理。也感谢 Alan Storm 和下面的 jason。
    • 手册中的措辞根本不清楚 - 我不得不进行一些实验来弄清楚它的行为方式。
    【解决方案2】:

    EXTR_PREFIX_SAME 将提取所有变量,并且只提取当前作用域中存在的前缀。

    EXTR_PREFIX_IF_EXISTS提取当前作用域中存在的变量,并为它们加上所需的前缀。

    所以,例如:

    $foo = 'foo';
    $bar = 'bar';
    
    extract(array('foo' => 'moo', 'bar' => 'mar', 'baz' => 'maz'), EXTR_PREFIX_IF_EXISTS, 'prefix');
    
    isset($prefix_foo); // true
    isset($prefix_baz); // false
    isset($baz); // false
    

    虽然....

    $foo = 'foo';
    $bar = 'bar';
    
    extract(array('foo' => 'moo', 'bar' => 'mar', 'baz' => 'maz'), EXTR_PREFIX_SAME, 'prefix');
    
    isset($prefix_foo); // true
    isset($prefix_baz); // false
    isset($baz); // true
    

    【讨论】:

      【解决方案3】:

      根据手动定义,EXTR_PREFIX_SAME会根据键名创建变量,如果本地空间中已经存在变量,则会给变量名添加前缀。

      相比之下,EXTR_PREFIX_IF_EXISTS 似乎继承了EXTR_IF_EXISTS 的行为(仅在变量已经存在时才覆盖),但不会覆盖局部变量,而是会创建一个前缀版本。

      考虑以下

      $array = Array();
      $array['foo'] = 'foo';
      $array['bar'] = 'bar';
      $array['baz'] = 'baz';  
      
      $foo = 'local foo';
      $bar = 'local bar';
      
      extract($array, EXTR_PREFIX_SAME, 'pre');
      
      print_r(get_defined_vars());
      
      //partial output    
      //Array
      //(
      //  [array] => Array
      //      (
      //          [foo] => foo
      //          [bar] => bar
      //          [baz] => baz
      //      )
      //
      //  [foo] => local foo
      //  [bar] => local bar
      //  [pre_foo] => foo
      //  [pre_bar] => bar
      //  [baz] => baz
      //) 
      

      所以对于EXTR_PREFIX_SAME,$foo 和 $bar 的值将保持不变,并且将定义三个新的局部变量($pre_foo、$pre_bar 和 $baz)。但是,如果我们使用EXTR_PREFIX_IF_EXISTS

      $array = Array();
      $array['foo'] = 'foo';
      $array['bar'] = 'bar';
      $array['baz'] = 'baz';  
      
      $foo = 'local foo';
      $bar = 'local bar';
      
      extract($array, EXTR_PREFIX_IF_EXISTS, 'pre');
      
      print_r(get_defined_vars());
      
      //partial output    
      //Array
      //(
      //  [array] => Array
      //      (
      //          [foo] => foo
      //          [bar] => bar
      //          [baz] => baz
      //      )
      //
      //  [foo] => local foo
      //  [bar] => local bar
      //  [pre_foo] => foo
      //  [pre_bar] => bar
      //)     
      

      $foo 和 $bar 的值仍然保留,但只有两个新变量被导入本地空间。由于 $baz 不是一个已经存在的变量,EXTR_PREFIX_IF_EXISTS 告诉 PHP 忽略数组中的 'baz' 键。

      【讨论】:

        猜你喜欢
        • 2019-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-11
        • 2020-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多