Это касается не только Smarty, но я думаю, что большинство шаблонных движков имеют назначенные переменные. Это скорее теоретический вопрос, чем практический. У меня нет варианта использования.
Что происходит в PHP, когда вы назначаете большой массив $a
другой переменной $b
? PHP копирует массив? Может быть, просто возможно, внутри он создает указатель. Что происходит, когда вы слегка изменяете $a
? $b
не следует изменять, потому что &
не использовался для создания $b
. PHP только удвоил использование памяти ??
Более конкретно: что происходит, когда вы назначаете большой массив из вашего контроллера ($a
) вашему шаблонному движку ($tpl->vars['a']
) и используете его в представлении (extract
- $a
)? Неужели память PHP только утроилась?
Теперь, что произойдет, если я назначу все свои переменные по ссылке? Я крут с моей точки зрения, что могу изменить массив обратно в контроллер (я все равно не вернусь туда). Также хорошо, если переменная изменяется в движке шаблонов ($tpl->vars['a']
).
Является ли лучше назначение памяти для всех переменных? Лучше для производительности? Если так: есть ли какие-либо шансы на странные, нежелательные побочные эффекты?
Потому что людям нравится код, а не истории:
// copies
$a = array( ... );
$tpl->assign('a', $a); // creates a copy (?) in $tpl->vars['a']
// pointer / by ref
$a = array( ... );
$tpl->assign_by_ref('a', $a); // creates a pointer in $tpl->vars['a'] because:
function assign_by_ref( $name, &$var ) {
$this->vars[$name] = $var; // voila pointer?
}
Я уверен, что PHP не возражает против больших массивов, копий и клонов, но с точки зрения производительности и памяти: что «лучше»?
редактировать
Для объектов все это не имеет значения. Объекты всегда автоматически присваиваются по ссылке. А поскольку объекты горячие, возможно, это устаревший вопрос, но мне * очень любопытно.
UPDATE
Так что PHP использует copy on write
... Люблю это. И объекты всегда указатели. Что происходит, когда вы:
$a = new BigObject;
$b = $a; // pointer, right?
$b->updateSomethingInternally(); // $b is now changed > what about $a?
Это вызвало копирование при записи? Или $ a и $ b все еще идентичны (как в ===
)?
редактировать
Могу ли я заключить, что назначение с помощью ref действительно не стоит того, чтобы просто сэкономить память? PHP сам по себе достаточно умен?
1050 * редактировать *
Интересная визуализация копий, клонов, ссылок и т. Д .: http://www.phpinsider.com/download/PHP5RefsExplained.pdf