这不仅仅是关于Smarty,我猜大多数模板引擎都有变量赋值。这更像是一个理论问题,而不是实际问题。我没有用例。
当你将一个大数组 $a
赋值给另一个变量 $b
时,PHP会发生什么?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不会介意大数组和复制,但就性能和内存而言,哪个更好呢?
编辑: 对于对象来说,所有这些都无关紧要。对象总是自动通过引用分配的。由于对象很热门,也许这是一个过时的问题,但我非常好奇。
更新: 所以PHP使用写时复制...太棒了。而且对象总是指针。当你做什么时会发生什么:
$a = new BigObject;
$b = $a; // pointer, right?
$b->updateSomethingInternally(); // $b is now changed > what about $a?
这会触发写时复制吗?还是$a和$b仍然相同(就像使用
===
一样)?编辑 我能得出结论,通过引用赋值真的不值得只为节省内存吗?PHP本身已经足够聪明了吗?
编辑 关于复制、克隆、按引用传递等的有趣可视化:http://www.phpinsider.com/download/PHP5RefsExplained.pdf