基本上我的设置是我有很多想要创建的对象。它将成为什么类型的对象取决于一个变量,即类型。所以最初我必须做很多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);
这会缩短我的代码并提高效率。
答案 0 :(得分:2)
如果没有对这些对象的进一步依赖,您可以简单地执行
$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');
}
}
}
同时结帐Is there a call_user_func() equivalent to create a new class instance?
答案 1 :(得分:0)
制作$all_objects
数组会导致更多问题。当你从那里得到一个元素时,它将是一个引用,所以每次你访问一个元素时,它都会与你上次访问它时的元素相同。 (例如:http://codepad.org/Z4B7glk9)
而是尝试这样的事情(PHP中的类名称不区分大小写):
$object_new = new $object->type();
答案 2 :(得分:0)
这可能就是你要找的东西:
$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;
当然,您需要图像,文本,链接和 Somethingelse 类。