关于php引用的问题

时间:2010-02-05 00:11:30

标签: php reference

当我在寻找一些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

有意义吗?对此有任何建议会有所帮助。

1 个答案:

答案 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(或更早版本)中,此方法用于防止不必要的对象重复。

(*)传递引用是件好事 - 当你只需要一个实例时,不需要创建对象的副本。