PHP的extract()函数是否使用copy-on-write将符号表添加到变量中?

时间:2012-11-29 06:16:15

标签: php function extract copy-on-write

对不起,我确定这个答案在互联网上的某个地方(甚至可能是stackoverflow),但我花了最后一小时搜索,似乎无法找到答案......

PHP的extract()函数是否使用copy-on-write?

为符号表添加变量

我知道默认情况下PHP函数调用都有写入时复制(除非你通过引用指定),只是对此感到好奇,因为我正在集成一个模板系统,所以我把一大堆变量放到$ data中数组,有时可能非常大,我想知道在包含模板文件之前提取它们是最好的方法。

谢谢!

编辑:

澄清:

    $array = array('a' => array(1,2,3), 'b' => array(3,4,5), 'c' => array(6,7,8));
    extract($array);
    //is $a, $b, $c Copy-On-Write at this point? Would be a lot better performance as opposed to allocating 3 new array()'s

    //I would like to avoid having this change the original $array values so using EXTR_REFS is not a good solution for me here if I can avoid it and still keep performance!
    $a = array(3);

2 个答案:

答案 0 :(得分:3)

两种版本都是可能的(提取值并通过引用提取) - 并且很容易展示两者:

function value() {
    $array = array('a' => 1, 'b' => 2);
    extract($array);
    var_dump($a);
    var_dump($b);
    $a = 3;
    $b = 4;
    var_dump($a);
    var_dump($b);
    var_dump($array);
}

function reference() {
    $array = array('a' => 1, 'b' => 2);
    extract($array, EXTR_REFS);
    var_dump($a);
    var_dump($b);
    $a = 3;
    $b = 4;
    var_dump($a);
    var_dump($b);
    var_dump($array);
} 

value();
/* 
int(1)
int(2)
int(3)
int(4)
array(2) {
  ["a"]=>
  int(1)    // original array item is unchanged
  ["b"]=>
  int(2)    // original array item is unchanged
}
*/

reference();
/*
int(1)
int(2)
int(3)
int(4)
array(2) {
  ["a"]=>
  &int(3)    // original array item is changed because it's a reference to the extracted variable
  ["b"]=>
  &int(4)    // original array item is changed because it's a reference to the extracted variable
}

extract()允许使用EXTR_REFS作为选项的第二个参数:

  

将变量提取为引用。这实际上意味着   导入变量的值仍然引用的值   var_array参数。您可以单独使用此标志或组合使用   通过对extract_type进行OR运算,可以使用任何其他标志。

答案 1 :(得分:0)

我会这样说,因为你可以传递一个EXTR_REFS标志,它将变量提取为引用。如果没有使用COW,就没有意义。

知道这一点,我会说如果你需要,继续提取,因为你没有修改的变量被优化了。