写作的重点是:$ foo =& new someClass();?

时间:2011-05-30 11:28:42

标签: php new-operator instantiation

由于我正在使用的库,我收到了一个弃用的警告。声明如下:

$this->_ole =& new OLERead();

问题是我不明白为什么人们会想要在实例化中使用& new

如果我没有弄错,&运算符会告诉PHP将引用复制到实例,而不是实例本身。但在这种情况下,要求提供未存储的引用副本是不是没有意义吗?

但是因为我并不完全知道new究竟是如何工作的,所以这可能是为了保存一些不起眼的垃圾收集,或类似的东西。

你怎么看?

4 个答案:

答案 0 :(得分:4)

来自documentation

  

从PHP 5开始,new运算符会自动返回引用,因此通过引用分配new的结果会导致PHP中的 E_DEPRECATED 消息5.3及更高版本,以及早期版本中的 E_STRICT 消息。

您使用的库可能是为PHP 4开发的。

有关使用的原因的有用信息也可以在migration guide中找到:

  

在PHP 5中有一个新的对象模型。 PHP对对象的处理已经完全重写,允许更好的性能和更多的功能。在以前的PHP版本中,对象的处理方式与原始类型(例如整数和字符串)相同。这种方法的缺点是语义上整个对象在分配变量时被复制,或者作为参数传递给方法。在新方法中,对象由句柄引用,而不是由值引用(可以将句柄视为对象的标识符)。

答案 1 :(得分:1)

这是PHP4兼容性的习惯用语。对象在默认情况下作为副本传递,这是一种解决方法,始终引用实例。

答案 2 :(得分:1)

在PHP4中,new返回了一个值而不是引用。

在PHP5中并非如此。

答案 3 :(得分:0)

如果你写$this->_old =& new OLERead();,任何对象的_ole更改都会更新对新对象的所有引用。

如果没有&

编辑:是的,在PHP的早期版本中,对象是通过副本传递的。最后,很难在版本中保持一致的行为。