由于我正在使用的库,我收到了一个弃用的警告。声明如下:
$this->_ole =& new OLERead();
问题是我不明白为什么人们会想要在实例化中使用& new
。
如果我没有弄错,&
运算符会告诉PHP将引用复制到实例,而不是实例本身。但在这种情况下,要求提供未存储的引用副本是不是没有意义吗?
但是因为我并不完全知道new
究竟是如何工作的,所以这可能是为了保存一些不起眼的垃圾收集,或类似的东西。
你怎么看?
答案 0 :(得分:4)
从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的早期版本中,对象是通过副本传递的。最后,很难在版本中保持一致的行为。