当我在寻找一些MVC框架时,我得到了网站: http://www.phppatterns.com/docs/design/archive/model_view_controller_pattern
然而,就像那里列出的代码让我对引用感到困惑。 例如:
$dao=& new DataAccess ('localhost','user','pass','dbname');
$productModel=& new ProductModel($dao);
它制作的每个实例,它都添加'&'在新运营商之前,它究竟意味着什么?对实例的引用?实际上,我删除了所有'&'在所有这些实例之前,代码仍能完美运行。
另一个,代码如下:
function ProductView (&$model) {
$this->model=& $model;
}
我真的认为可以修改如下:
function ProductView (&$model) {
$this->model=$model;
}
我是对的吗?这两者之间的区别是什么?实际上,就像上面列出的MVC代码示例一样?如果你像我一样修改代码,代码仍然有用。
然后,我在其他地方发了这篇文章: http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html
有意义吗?对此有任何建议会有所帮助。
答案 0 :(得分:2)
在PHP版本5之前,对象按值传递,您必须显式指定&符号以通过引用获取对象。*
在PHP 5+中,所有对象都通过引用传递,因此使用&符号是多余的。
此外,从PHP 5.3.0开始,如上所述的代码将生成STRICT错误“不推荐使用引用分配新值的返回值”。
如果您对“ $o =& new Object()
”代码的历史使用情况(PHP 4或之前)感到好奇,请参阅php-by-reference(特别是,接受的答案提供了好的解释)。
总结:
在PHP 5或更高版本中,它没有任何区别。代码将按预期使用否内存或其他差异。
在PHP 5.3中,您可能会收到一些STRICT通知抱怨此用法(假设您已启用STRICT通知)。
在PHP 4.x(或更早版本)中,此方法用于防止不必要的对象重复。
(*)传递引用是件好事 - 当你只需要一个实例时,不需要创建对象的副本。