__clone方法不是复制类对象

时间:2013-07-25 12:26:12

标签: php

我想使用__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);
?>

2 个答案:

答案 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

请注意,此嵌套应该与您希望接收副本一样深。任何其他内容都将通过引用进行复制,并可能导致头痛。一般经验法则:小心克隆。