我想使用__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);
?>
答案 0 :(得分:3)
而不是
$copy = $obj->__clone();
你应该使用
$copy = clone $obj;
调用__clone()
clone
方法
答案 1 :(得分:2)
首先,您不要通过直接调用其__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
请注意,此嵌套应该与您希望接收副本一样深。任何其他内容都将通过引用进行复制,并可能导致头痛。一般经验法则:小心克隆。