2012-11-29 13 views
1

对不起,我确定这个答案是在互联网上的某个地方(甚至可能是stackoverflow),但我花了最后一个小时搜索,似乎无法找到答案...PHP的extract()函数是否使用copy-on-write将变量添加到符号表中?

PHP的extract()函数添加变量符号表使用拷贝写?

我知道PHP函数调用默认情况下都有一个copy-on-write(除非您通过引用指定),只是对此进行了好奇,因为我正在集成模板系统,因此我将大量变量抓到$数据数组,有时候这个数组可能非常大,我想知道在包含模板文件之前是否提取它们是解决这个问题的最好方法。

谢谢!

编辑:

澄清:

$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); 

回答

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参数的值 。您可以单独使用此标志,也可以通过OR'ing extract_type将其与任何其他标志组合使用 。

+0

嘿感谢您的答案!但是,这并不是我所要求的。我想知道,如果默认情况下提取功能将通过引用与写入副本添加变量。因此,在第一个例子中,我想知道$ a是否是一个引用(假设它是一个对象/数组或其他东西),然后根据写入的副本将它分配给它之后变成一个值?我想知道这是出于性能原因...我想避免提取后改变原始值。 – newms87

+0

仍然没有完全回答这个问题,但对于任何最终在这里更好地了解提取函数如何与引用/复制一起工作的人来说,它是非常有用的。 – newms87

0

我要说的是这样,因为有EXTR_REFS标志,你可以通过提取这些变量的引用。如果COW没有被使用,那就没有意义了。

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

+0

我不确定我是否同意这一逻辑......我不确定他们是否会根据是否使用COW来包含EXTR_REFS。这是有道理的,它将在这里用于性能目的,但我想确定它在使用之前,我最终决定如何处理此问题。感谢您花时间回答! – newms87

相关问题