__clone方法没有复制类对象


__clone method is not making copy of class object

我想使用__clone()复制类对象,然后打印该复制对象。这是代码:

<?php
class Test {
    public static $counter = 0;
    public $id;
    public $other;

    public function __construct(){ 
       $this->id = self::$counter++;
    }
    public function __clone()
    {
       $this->other = $that->other;
       $this->id = self::$counter++;
    }
}
$obj = new Test();
$copy = clone $obj;
print_r($copy);
?>

而不是

$copy = $obj->__clone();

你应该使用

$copy = clone $obj;

调用clone 时会调用__clone()方法

首先,您不能通过直接调用对象的__clone方法来克隆对象。您应该使用clone语言构造,如下所示:

$new = clone $old;

这将调用__clone方法,以便在对象被克隆后执行任何额外的工作。

需要注意的是:在PHP中,对象是通过引用分配的。这意味着,如果克隆的对象A具有指向对象B的变量,则在原始对象上修改B将影响克隆,反之亦然。

__clone方法允许您在克隆发生时做出反应,因此您也可以正确地克隆B。像这样:

class B { }
class A {
    public $b;
    public function __construct() {
        $this->b = new B();
    }
    public function __clone() {
        $this->b = clone $b;
    }
}
$a = new A();
$c = clone $a;
// now you can safely modify $c->b without worrying about $a->b

请注意,这个嵌套应该深入到您想要接收的副本的深度。任何其他内容都将通过引用进行复制,并可能导致后续问题。一般经验法则:小心克隆。