2013-07-25 34 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 

請注意,這種嵌套應該儘可能深,你想要接收副本。其他任何東西都會被引用複製,並可能導致頭痛。一般經驗法則:小心克隆。