2012-06-05 40 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);