2015-12-15 24 views
4

克隆作爲另一個對象的子對象的對象時,「是否需要」指示屬於子類__clone()方法或子類__clone()中的對象的所有父屬性方法只能包含它自己的不屬於父對象的對象屬性?如何處理子類對象屬性的__clone

下面是一個例子

目的Child_A延伸對象Parent_A

對象Parent_A在其構造函數中使用對象A_1並具有__clone()方法。

class Parent_A{ 

    function __construct(A_1 $a_1){ 
     $this->A_1 = $a_1; 
    } 

    function __clone(){ 
     $this->A_1 = clone $this->A_1; 
    } 
} 

目的Child_A要求A_2構建。

class Child_A{ 

    function __construct(A_2 $a_2){ 
     parent::__construct(new A_1()); 

    } 

    function __clone(){ 

     $this->A_2 = clone $this->A_2; 
    } 
} 

如果我想打的Child_A深層副本,將包括DEEP_COPY A_1,我應該在Child_A使用:

function __clone(){ 

     $this->A_1 = clone $this->A_1; 
     $this->A_2 = clone $this->A_2; 
    } 

或者是下面的足夠的父對象的克隆方法已經包括A_1

function __clone(){ 

     $this->A_2 = clone $this->A_2; 
    } 

謝謝。

+2

我不知道這個問題的答案了我的頭頂部,但couldn」你檢查創建的對象,並自己確定?我確定這個過程的方法是爲每個對象創建一個id,並讓對象在echo或error_log中的每一步中報告它的id。然後,嘗試這兩種方法,看看你是否得到你期望的結果。 – starshine531

+0

100賞金已經回答了問題? HTTP://計算器。com/questions/10831798/php-deep-clone-object只是使用unserialize(serialize($ object)); – AhmetRasitBekar

回答

5

首先,你Child_A不延長Parent_A,所以這種結構

class Child_A { 

    function __construct(A_2 $a_2){ 
     parent::__construct(new A_1()); 
    } 
} 

結果與致命錯誤在第一次嘗試將類實例。

其次,您在那裏沒有使用$a_2,因此Child_A::__clone將導致通知未定義的變量A_2

最後,要回答這個問題 - 不,如果沒有明確調用,父母的__clone不會被調用。推薦的解決方案是隻讓自己的屬性的孩子把手克隆,並讓父母照顧與其屬性有關:

class Parent_A 
{ 
    protected $a_1; 

    function __construct(A_1 $a_1) 
    { 
     $this->a_1 = $a_1; 
    } 

    function __clone() 
    { 
     $this->a_1 = clone $this->a_1; 
    } 
} 

class Child_A extends Parent_A 
{ 
    protected $a_2; 

    function __construct(A_2 $a_2) 
    { 
     $this->a_2 = $a_2; 
     parent::__construct(new A_1); 
    } 

    function __clone() 
    { 
     $this->a_2 = clone $this->a_2; 
     return parent::__clone(); 
    } 
} 
+0

非常感謝'parent :: __ clone()'這就是我一直在尋找的東西。 – Vincent

3

似乎你需要DeepCopy。從PHPExcel

採取代號
public function __clone() { 
    foreach($this as $key => $val) { 
     if (is_object($val) || (is_array($val))) { 
      $this->{$key} = unserialize(serialize($val)); 
     } 
    } 
} 

還有一個模塊,將做到這叫做DeepCopy

PHP文檔還定義了Objects Cloning

+0

請注意,如果克隆邏輯比「克隆所有屬性」複雜一點,它可能不起作用。另外un /序列化調用睡眠魔法,可能有副作用。 –

相關問題