首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Object Cloning

Creating a copy of an object with fully replicated properties is not always the wanted behavior. A good example of the need for copy constructors, is if you have an object which represents a GTK window and the object holds the resource of this GTK window, when you create a duplicate you might want to create a new window with the same properties and have the new object hold the resource of the new window. Another example is if your object holds a reference to another object which it uses and when you replicate the parent object you want to create a new instance of this other object so that the replica has its own separate copy.

An object copy is created by using the clone keyword (which calls the object's __clone() method if possible). An object's __clone() method cannot be called directly.

代码语言:javascript
复制
$copy_of_object = clone $object;

When an object is cloned, PHP 5 will perform a shallow copy of all of the object's properties. Any properties that are references to other variables will remain references.

代码语言:javascript
复制
void __clone ( void )

Once the cloning is complete, if a __clone() method is defined, then the newly created object's __clone() method will be called, to allow any necessary properties that need to be changed.

Example #1 Cloning an object

代码语言:javascript
复制
<?php
class?SubObject
{
????static?$instances?=?0;
????public?$instance;

????public?function?__construct()?{
????????$this->instance?=?++self::$instances;
????}

????public?function?__clone()?{
????????$this->instance?=?++self::$instances;
????}
}

class?MyCloneable
{
????public?$object1;
????public?$object2;

????function?__clone()
????{
????????//?Force?a?copy?of?this->object,?otherwise
????????//?it?will?point?to?same?object.
????????$this->object1?=?clone?$this->object1;
????}
}

$obj?=?new?MyCloneable();

$obj->object1?=?new?SubObject();
$obj->object2?=?new?SubObject();

$obj2?=?clone?$obj;


print("Original?Object:\n");
print_r($obj);

print("Cloned?Object:\n");
print_r($obj2);

?>

The above example will output:

代码语言:javascript
复制
Original Object:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 1
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)
Cloned Object:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 3
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)

PHP 7.0.0 introduced the possibility to access a member of a freshly cloned object in a single expression:

Example #2 Access member of freshly cloned object

代码语言:javascript
复制
<?php
$dateTime?=?new?DateTime();
echo?(clone?$dateTime)->format('Y');
?>

The above example will output something similar to:

代码语言:javascript
复制
2016

Comparing Objects →

代码语言:txt
复制
 ? 1997–2017 The PHP Documentation Group

Licensed under the Creative Commons Attribution License v3.0 or later.

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com