【发布时间】:2011-04-26 18:25:48
【问题描述】:
这不仅仅是关于 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 使用 copy on write... 喜欢它。对象总是指针。当你:
$a = new BigObject;
$b = $a; // pointer, right?
$b->updateSomethingInternally(); // $b is now changed > what about $a?
这是否触发了写时复制?还是 $a 和 $b 仍然相同(如===)?
编辑
我可以得出结论,仅仅为了节省内存,通过 ref 分配真的不值得吗? PHP 本身就足够聪明?
编辑
复制、克隆、按引用等有趣的可视化:http://www.phpinsider.com/download/PHP5RefsExplained.pdf
【问题讨论】:
-
谢谢尼克。忘记那个代码块了。
-
解决您的最后一次编辑:是的,这不值得。 PHP 在一般情况下足够聪明。此外:您根本不必担心这一点,内存通常不是网站的问题。
标签: php smarty pass-by-reference template-engine