关于php引用的问题

关于php引用的问题,php,reference,Php,Reference,当我在寻找一些MVC框架时,我得到了以下网站: 然而,就像上面列出的代码一样,我对引用感到困惑。 例如: $dao=& new DataAccess ('localhost','user','pass','dbname'); $productModel=& new ProductModel($dao); 它创建的每个实例都在新操作符之前添加了“&”,这到底意味着什么?对实例的引用?实际上,在所有这些实例之前,我删除了所有的“&”,代码仍然可以完美地工作 另一种,代码如

当我在寻找一些MVC框架时,我得到了以下网站:

然而,就像上面列出的代码一样,我对引用感到困惑。 例如:

  $dao=& new DataAccess ('localhost','user','pass','dbname');
  $productModel=& new ProductModel($dao);
它创建的每个实例都在新操作符之前添加了“&”,这到底意味着什么?对实例的引用?实际上,在所有这些实例之前,我删除了所有的“&”,代码仍然可以完美地工作

另一种,代码如下:

 function ProductView (&$model) {
    $this->model=& $model;
 }
我真的认为可以修改如下:

function ProductView (&$model) {
    $this->model=$model;
}
我说得对吗?这两者有什么区别?实际上,就像上面列出的MVC代码示例一样?如果你像我一样修改代码,代码仍然有效

然后,我在其他地方找到了这篇帖子:


这有意义吗?关于这一点的任何建议都会很有帮助。

在PHP版本5之前,对象是按值传递的,您必须显式指定符号和才能通过引用获取对象*

在PHP5+中,所有对象都是通过引用传递的,因此使用符号是多余的

此外,从PHP5.3.0开始,类似于上面的代码将生成一个严格的错误“通过引用分配new的返回值是不推荐的”

如果您对“
$o=&new Object()
”代码的历史用法(PHP4或之前)感到好奇,请参阅(特别是,这里接受的答案提供了一个很好的解释)

总结如下:

  • 在PHP5或更高版本中,这没有什么区别。代码将在内存或其他差异的情况下正常工作

  • 在PHP5.3中,您可能会收到一些关于此用法的严格通知(假设您打开了严格通知)

  • 在PHP4.x(或更早版本)中,此方法用于防止不必要的对象复制


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

我相信这是在PHP中处理对象的一种老方法。很老了。AFAIR,因为v5对象默认作为引用传递。好的,我明白了。我从C++到PHP,只使用PHP5.x,只需挖掘PHP的一些历史信息,非常感谢。只是注意到,在一些边缘情况下,显式引用与隐式对象引用的功能略有不同。我看到过代码失败,因为PHP5的对象引用猜测出了一些错误——将其更改为显式引用,它再次工作。不幸的是,很难找到这样的例子。我没有见过这样的案例(也没有听说过)。可惜你没有任何测试用例。我很想知道这是什么时候/如何发生的。如果你找到了,就把它贴在这里:)