Добавляет ли функция 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 не использовался, в этом не было бы никакого смысла.
Зная это, я бы сказал, что если нужно, продолжайте извлекать, поскольку переменные, которые вы не модифицируете, оптимизированы.