我们有一个系统,我们有理由在知道其特定类型之前实例化一个对象。例如,我们希望在我们知道最终类是“book”还是“cd”之前实例化一个类“media”。
以下是我们正在做的事情。我们实例化“媒体”对象,一旦我们知道它是什么类型的媒体,我们就会实例化一本“书”,传入媒体对象。
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 );
有没有更好的方法来做这样的事情?这是动态多态吗?
答案 0 :(得分: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);