1

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

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

4

1 回答 1

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);
于 2012-06-05T04:16:44.217 回答