2012-06-05 88 views
1

我們有一個系統,我們有理由在我們知道它的具體類型是什麼之前實例化一個對象。例如,我們希望在確定最終課程是「book」還是「cd」之前,先實例化一個類「媒體」。在PHP中實例化後更改對象的類型

以下是我們正在做的事情。我們實例化「媒體」對象,一旦我們知道它是什麼類型的媒體,我們實例化一個「書」,傳入媒體對象。

class Book extends Media 
{ 
    public function __construct($parent) 
    { 
     $vars = get_object_vars($parent); 

     foreach($vars as $key => $value) 
      $this->$key = $value; 
    } 
} 

//elsewhere 
$item = new Media(); 
$item->setPrice($price); 
//other code, figure out the item type 
$item = new Book($item); 

有沒有更好的方法來做這樣的事情?這是動態多態嗎?

+1

你有沒有看着[此帖](http://stackoverflow.com/questions/3243900/convert-cast-an-stdclass-object-to-another-class) ? – Roberto

+0

我沒有見過。第二個反應,使用反射,看起來很有趣。 – Karptonite

回答

0

如果你真的不能確定什麼類型的對象是我可以推薦你的工廠模式。有了這個模式,你只有一個入口點,這有助於讓你的代碼更加簡單易讀。

短的例子:

class ObjectFactory { 
     public static function factory($object, $objectType) 
     { 
      $result = false; 

      switch ($objectType) { 
       case 'book': 
        $result = new Book; 
        $result->setParams($object->getParams()); 
        break; 

       case 'otherType': 
        $result = new OtherType; 
        $result->setParams($object->getParams()); 
        // or 
        $result->setParamsFromObject($object); 
        break; 
        ... //etc 
      } 
      return $result; 
     } 
    } 

    class Book extends MediaAbstract 
    { 
     public function __set($name, $value) 
     { 
      $this->_params($name, $value); 
     } 

     public function __get($name) 
     { 
      return $this->_params[$value]; 
     } 

     public function setParams(array $params) 
     { 
      $this->_params = $params; 
      return $this; 
     } 

     public function getParams() 
     { 
      return $this->_params; 
     } 

     // in case u want store params as properties 

     public function setParamsFromObject($object) 
     { 
      $vars = get_object_vars($object); 
      foreach ($vars as $key => $value) { 
       $this->$key = $value; 
      } 

      return $this; 
     } 
    } 

$media = new Media; 
$media->setParams($params) 
// some stuff 
//... 
$book = ObjectFactory::factory($media, $objectType);