Php 通过数组初始化对象

Php 通过数组初始化对象,php,arrays,object,Php,Arrays,Object,基本上,我的设置是,我有很多我想创建的对象。它将成为什么类型的对象取决于一个变量,即类型。最初我需要做很多if语句,所以为了缩短它,我创建了一个数组,但是我遇到了通过数组创建实际对象的问题 以下是我最初的想法: if($object->type = 'text') { $object_new = new Text(); } elseif($object->type = 'image') { $object_new = new Image(); } .... 但我想做

基本上,我的设置是,我有很多我想创建的对象。它将成为什么类型的对象取决于一个变量,即类型。最初我需要做很多if语句,所以为了缩短它,我创建了一个数组,但是我遇到了通过数组创建实际对象的问题

以下是我最初的想法:

if($object->type = 'text')
{
    $object_new = new Text();
} elseif($object->type = 'image') {
    $object_new = new Image();
} ....
但我想做的是:

$all_objects = array('text'=> new Text(), 'image' => new Image(), ...);
$object_new = $all_objects($object->type);

这将大大缩短我的代码,并使其更高效。

如果对这些对象没有进一步的依赖关系,您只需执行以下操作即可

$className = $object->type;
$instance = new $className;
如果您需要更复杂的创建逻辑,您可以将创建代码放在Lambdas中,然后调用它们,例如

$allTypes = array(
    'text' => function($string) { return new Text($string); },
    'Image' => function($path) { return new Image($path); }
);
$instance = call_user_func_array($allTypes[$object->type], array($argument1));
或者创建Factory对象并将开关/机箱放入其中:

class Factory
{
    public function create($type)
    {
        switch ($type)
        {
            case 'text':
                return new Text;
            case 'image':
                return Image($this->create('foo'));
            case 'foo':
                return new Foo;
            default:
                throw new Exception('No clue what to create');
        }
    }
}

另外,签出生成
$all\u对象数组将导致更多问题。当你从那里得到一个元素时,它就是一个引用,所以每次你访问一个元素时,它都和你上次访问它时一样。(例如:)

相反,请尝试类似的方法(PHP中的类名不区分大小写):


演示:

这可能就是您想要的:

$types = array('image', 'text', 'link', 'somethingelse');
foreach ($types as $type) {
    $$type = new ucfirst($type);
}
这意味着:

$image         = new Image;
$text          = new Text;
$link          = new Link;
$somethingelse = new Somethingelse;

当然,你需要有图像、文本、链接等类。

应该可以,但你需要
$all_objects[…]
而不是
()
…我想他只是想用字符串作为名称创建一个类的实例。我认为他不需要创建所有类的实例。但是,在使用自动加载和区分大小写的文件系统时,需要小心。(至少对于第一种方法;))
$image         = new Image;
$text          = new Text;
$link          = new Link;
$somethingelse = new Somethingelse;