我在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()
{
// Force a copy of this->object, otherwise
// it will point to same object.
$this->object1 = clone $this->object1;
$this->object2 = clone $this->object2;
}
}
$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);
?>
当我执行此$obj2 = clone $obj;
时,有人会解释我实际发生了什么吗?这会调用MyCloneable
班级function __clone()
或SubObject
班级public function __clone()
吗?
逐步解释会更有帮助。感谢。
答案 0 :(得分:1)
__clone
函数处理clone
关键字。使用
$obj2 = clone $obj;
可以表示为
$obj2 = $obj::__clone();
但这对你来说很明显。
clone ...
调用__clone
类的MyCloneable
方法。它与SubObject
类无关。 object1
和object2
只是$obj
对象的属性,属于MyCloneable
类。
当然,当您致电clone
时,将会克隆object1
和object2
属性,但它们仍然是对象的属性。 $obj2
将属于MyCloneable
类。
我的答案是否满足您的需求?
clone
方法中的 MyCloneable::__clone()
个关键字正在创建$object1
和$object2
属性的克隆。在实践中,它没有给出任何结果,因为您将克隆分配给这些克隆的制造商。
MyCloneable::__clone()
中发生了什么 - 它正在调用SubObject::__clone()
方法实际上是这样做的:
$this->instance = ++self::$instances;
请注意,instances
属性 static 所以每次创建新或克隆现有对象时,{{ 1}}增量。