类与对象(PHP5)之对象克隆(Object cloning)

通过完全地复制属性创建一个对象的拷贝不是通常想要的行为。需求的一个好的实例适合于拷贝构造函数,
如果有一个对象描述一个GTK窗口和对象保存这个GTK窗口的资源,当你创建一个副本,你或许想创建一个相同的属性新窗口使用和保存新对象资源的新窗口。另一个例子是当你复制父对象时如果保存一个引用给另一个对象,你想创建其他类的一个新实例来分开拷贝所属的复制品。一个对象的拷贝是使用clone关键字来创建的(如果可能的话可以调用对象的__clone()方法),一个对象的__clone()方法不能被直接声明。

nclick="copycode($('phpcode3'));" href="###">[复制PHP代码]
PHP代码如下:

$copy_of_object = clone $object;

当一个对象被克隆时,PHP5将执行一个所有对象的属性的浅拷贝。任何对其它变量引用的属性将只保留引用。如果一个__clone()方法被定义,然后重新创建一个对象的克隆方法来允许任何必需的属性当它需要被改变时调用。
例子 19-30. 克隆一个对象

PHP代码如下:

[复制到剪切板]
CODE:
<?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()
    {
       
$this->object1=clone($this->object1);//Force a copy of this->object,otherwise it will point to same object.
    
}
}
$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);
?> ;


上例将输出:

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
        )
)
毕业了。。。