通过完全地复制属性创建一个对象的拷贝不是通常想要的行为。需求的一个好的实例适合于拷贝构造函数,
如果有一个对象描述一个GTK窗口和对象保存这个GTK窗口的资源,当你创建一个副本,你或许想创建一个相同的属性新窗口使用和保存新对象资源的新窗口。 另一个例子是当你复制父对象时如果保存一个引用给另一个对象,你想创建其他类的一个新实例来分开拷贝所属的复制品。一个对象的拷贝是使用clone关键字 来创建的(如果可能的话可以调用对象的__clone()方法),一个对象的__clone()方法不能被直接声明。$copy_of_object = clone $object;
当一个对象被克隆时,PHP5将执行一个所有对象的属性的浅拷贝。任何对其它变量引用的属性将只保留引用。如果一个__clone()方法被定义,然后重新创建一个对象的克隆方法来允许任何必需的属性当它需要被改变时调用。
例子 19-30. 克隆一个对象
PHP代码如下:
- <?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.这里也不算是深度拷贝,因为object1只是自己拷贝自己,只是为了说明使用clone关键字是要创建新对象的
- }
- }
- $obj = new MyCloneable();
- $obj->object1 = new SubObject();
- $obj->object2 = new SubObject();
- $obj2 = clone $obj;
- echo "<pre>";
- print("Original Object:\n");
- print_r($obj);
- print("Cloned Object:\n");
- print_r($obj2);
- echo "</pre>";
- ?>
上例将输出:
- Original Object:
- MyCloneable Object
- (
- [object1] => SubObject Object
- (
- [instance] => 1
- )
- [object2] => SubObject Object
- (
- [instance] => 2
- )
- )
- Cloned Object:
- MyCloneable Object
- (
- [object1] => SubObject Object
- (
- [instance] => 3 //object1创建了新对象
- )
- [object2] => SubObject Object
- (
- [instance] => 2 //object2只是引用的拷贝
- )
- )
引自: