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