2013-07-25 35 views
-2

我想使用__clone()来创建类对象的副本,之后我想打印该副本对象。 这里是代码:__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

有什么问题? –

+0

'$ that'应该是什么? – Vatev

回答

3

而不是

$copy = $obj->__clone(); 

您应该使用

$copy = clone $obj; 

,当你调用clone

2

首先,你做的__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 

请注意,这种嵌套应该尽可能深,你想要接收副本。其他任何东西都会被引用复制,并可能导致头痛。一般经验法则:小心克隆。