2015-10-19 60 views
1

是否可以僅在PHP中克隆對象的父對象?我試過使用此代碼,但它返回一個Fatal error: __clone method called on non-object錯誤消息。你可以在PHP中克隆一個對象的父對象嗎?

這裏是我的代碼:

class A { 
    public $val1=1; 
    public $val2=2; 
} 

class B extends A { 
    public $val3=3; 

    public function getParent() { 
     return clone parent; 
    } 
} 

$B=new B(); 
$A=$B->getParent(); 

我inted使用這種方式,將以下內容:
我們建議我不得不類:TableRecord extends TableTable類包含有關MySQL數據庫表的信息,它包含的字段,這些字段的默認值,主鍵,最重要的是它包含三種方法(插入,刪除,更新),但我們只會討論這裏刪除。這三個方法作爲匿名函數存儲在類中的受保護數組中。表類的刪除方法告訴在從相應表中刪除某些內容時要執行什麼操作。

例如,我們有以下三種MySQL表:孩子孫子。這些表連接在一起以下列方式:在表中的記錄可以在孩子被鏈接到多個記錄表,而在孩子表可在孫子被鏈接到幾個記錄的記錄表。

在這個例子中, MySQL表的 Table對象會告訴我們,當我們從這個表中,基於表的主鍵刪除一條記錄,我們應該從 刪除所有記錄

所以兒童表與此記錄相關聯。 子女的刪除方法表中有類似的說法:當我們從表中刪除一條記錄時,我們應該從孫子表中刪除每條記錄,其中子女表剛剛被刪除。

當我在我的代碼中初始化對象時,我將只初始化Record extends Table對象。第一次,Table對象通過Record extends Table對象進行初始化,它應該存儲在Table類的靜態變量中,以供將來使用,因此從表中刪除某些內容時,我不必創建新記錄,我只是使用:Table::$tables['parent']->delete(5);這將刪除主鍵爲5的表中的記錄,並刪除需要刪除的所有其他內容。

我不知道這是否有意義(它可以是非全面的,因爲英語不是我的本地語言,或者因爲它在地球的另一端相當晚,也許有一個更容易和更清潔解決我的問題,然後我想象的那個)

+2

這沒有意義,因爲'parent'不是一個對象,而是對父_class_的引用。類不能被克隆。 – arkascha

+0

'返回新父項;' – AbraCadaver

+0

@AbraCadaver哪一個幾乎不會返回一個克隆? – arkascha

回答

1

不,你不能(在PHP中)。在這種情況下適當的方法是:

class B extends A { 
    public $val3=3; 

    public function toA() { 
     $a = new A(); 
     // Note: If $this->val is an object value you need to 
     // use $a->val = clone $this->val; 
     $a->val1 = $this->val1; 
     $a->val2 = $this->val2; 
     return $a; 
    } 
} 

但是,一個適當的OOP設計不應該要求這樣的方法。編寫處理A的零件可以簡單地處理B,如A,因爲BA延伸。我的意思是這是繼承的基本思想之一。