Добавляет ли функция PHP extract() добавление переменных в таблицу символов, используя копирование при записи?

Извините, я уверен, что этот ответ находится где-то в Интернете (возможно, даже через стек), но я провел последний час в поисках и не могу найти ответ...

Добавляет ли функция PHP extract() добавление переменных в таблицу символов, используя копирование при записи?

Я знаю, что все вызовы функций 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 ответа

Решение

Возможны обе версии (извлечение значений и извлечение по ссылке) - и довольно легко продемонстрировать обе:

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.

Я бы сказал, что это так, поскольку есть EXTR_REFS флаг, который вы можете передать, который извлекает переменные как ссылки. Если бы COW не использовался, в этом не было бы никакого смысла.

Зная это, я бы сказал, что если нужно, продолжайте извлекать, поскольку переменные, которые вы не модифицируете, оптимизированы.

Другие вопросы по тегам