PHP可克隆对象

时间:2013-11-22 10:56:41

标签: php object clone

我在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()吗?

逐步解释会更有帮助。感谢。

1 个答案:

答案 0 :(得分:1)

__clone函数处理clone关键字。使用

$obj2 = clone $obj;

可以表示为

$obj2 = $obj::__clone();

但这对你来说很明显。

clone ...调用__clone类的MyCloneable方法。它与SubObject类无关。 object1object2只是$obj对象的属性,属于MyCloneable类。

当然,当您致电clone时,将会克隆object1object2属性,但它们仍然是对象的属性。 $obj2将属于MyCloneable类。

我的答案是否满足您的需求?

编辑:

clone方法中的

MyCloneable::__clone()个关键字正在创建$object1$object2属性的克隆。在实践中,它没有给出任何结果,因为您将克隆分配给这些克隆的制造商MyCloneable::__clone()中发生了什么 - 它正在调用SubObject::__clone()方法实际上是这样做的:

$this->instance = ++self::$instances;

请注意,instances属性 static 所以每次创建克隆现有对象时,{{ 1}}增量。