首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP的extract()函数是否使用写入时复制将变量添加到符号表中?

PHP的extract()函数是否使用写入时复制将变量添加到符号表中?
EN

Stack Overflow用户
提问于 2012-11-29 14:16:15
回答 2查看 414关注 0票数 1

对不起,我确信这个答案在互联网上的某个地方(甚至可能是stackoverflow),但我花了一个小时寻找,似乎找不到答案……

PHP的extract()函数是否使用写入时复制将变量添加到符号表中?

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

谢谢!

编辑:

澄清一下:

代码语言:javascript
复制
    $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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-29 20:11:14

这两个版本都是可能的(提取值和引用提取)-并且很容易展示这两个版本:

代码语言:javascript
复制
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运算将其与任何其他标志组合使用。

票数 3
EN

Stack Overflow用户

发布于 2012-11-29 14:26:51

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

知道了这一点,我会说,如果你需要的话,可以继续提取,因为你没有修改的变量已经针对这些变量进行了优化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13619948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档