开发者

What's the point of writing : $foo = & new someClass();?

I am getting a deprecated warning because of a library I am using. The st开发者_运维知识库atement is the following :

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

The thing is I don't see why one would want to use & new in an instantiation.

If I am not mistaken, the & operator tells PHP to copy the reference to the instance, and not the instance itself. But in that case, isn't it pointless to ask for a copy of a reference that isn't stored ?

But since I don't exactly know how new exactly works, maybe this was supposed to save some obscure garbage collection, or something like that.

What do you think about that ?


From the documentation:

As of PHP 5, the new operator returns a reference automatically, so assigning the result of new by reference results in an E_DEPRECATED message in PHP 5.3 and later, and an E_STRICT message in earlier versions.

The library you use was probably developed for PHP 4.

Helpful information about why this was used can also be found in the migration guide:

In PHP 5 there is a new Object Model. PHP's handling of objects has been completely rewritten, allowing for better performance and more features. In previous versions of PHP, objects were handled like primitive types (for instance integers and strings). The drawback of this method was that semantically the whole object was copied when a variable was assigned, or passed as a parameter to a method. In the new approach, objects are referenced by handle, and not by value (one can think of a handle as an object's identifier).


That's an idiom for PHP4 compatibility. Objects were passed as copies per default there, and this is a workaround to always have references to an instance.


In PHP4, new returned a value and not a reference.

This is not the case in PHP5.


If you write $this->_old =& new OLERead(); a changement of _ole in any object will updates all references to the new object.

This is not the case without & .

EDIT: And yes, in previous versions of PHP, object were passed by copy. At the end, this is quite hard to have a consistent behaviour accross versions.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜