2008-09-23 149 views

回答

6

你可以有你類實例化爲空,然後通過任意數量的方法加載。其中一個方法可以接受的父類作爲參數的一個實例,然後從那裏

class childClass extends parentClass 
{ 
    function childClass() 
    { 
     //do nothing 
    } 

    function loadFromParentObj($parentObj) 
    { 
     $this->a = $parentObj->a; 
     $this->b = $parentObj->b; 
     $this->c = $parentObj->c; 
    } 
}; 

$myParent = new parentClass(); 
$myChild = new childClass(); 
$myChild->loadFromParentObj($myParent); 
+0

這是更少我目前的解決方案。我想我不能指望任何其他魔法來做到這一點。 – 2008-09-23 07:26:38

1

我可以想象你會不得不發明某種「複製構造函數」。然後,您只需創建一個新的子類對象,同時傳入原始對象。

2

最好的方法是在子類中創建一個克隆的方法,讓你可以這樣做:

$myvar = $subclass->clone($originalObject) 

另外,它聽起來就像你可以看看Decorator模式php example

+0

沒有去PHP4,除非我自己實現克隆 – 2008-09-23 07:26:02

3

複製其數據PHP對象不是一大堆的數組不同,因爲所有PHP 4的對象變量是公開的,你可以做一些亂七八糟的東西,像這樣:

function clone($object, $class) 
{ 
    $new = new $class(); 
    foreach ($object as $key => $value) 
    { 
      $new->$key = $value; 
    } 
    return $new; 
} 
$mySubclassObject = clone($myObject, 'mySubclass'); 

它不漂亮,它的certianly不是我認爲是很好的做法,但它可重複使用,這是非常整潔。

5

你可以用一些黑魔法做到這一點,雖然我會嚴肅地質疑爲什麼你首先有這個要求。這表明你的設計有嚴重的錯誤。

儘管如此:

function change_class($object, $new_class) { 
    preg_match('~^O:[0-9]+:"[^"]+":(.+)$~', serialize($object), $matches); 
    return unserialize(sprintf('O:%s:"%s":%s', strlen($new_class), $new_class, $matches[1])); 
} 

這是受到相同的限制的serialize在一般情況下,這意味着,對其他對象或資源的引用都將丟失。

+0

認真的,它的工作原理。但是怎麼樣?! – Alfa 2015-05-11 04:55:09

相關問題