在PHP中实例化后更改对象的类型

时间:2012-06-05 01:23:58

标签: php object

我们有一个系统,我们有理由在知道其特定类型之前实例化一个对象。例如,我们希望在我们知道最终类是“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 );

有没有更好的方法来做这样的事情?这是动态多态吗?

1 个答案:

答案 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);