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

uが実際にどのタイプのオブジェクトであるかを判別できない場合は、uファクトリパターンを推奨できます。このパターンでは、uにはエントリポイントが1つしかないため、yrコードをより単純で読みやすくすることができます。

簡単な例:

    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 に答える