2012-05-16 123 views
0

基本上我的设置是我有很多想创建的对象。它将变成什么类型​​的对象取决于一个变量,即类型。所以最初我将不得不做很多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); 

这将缩短我的代码受到了很多,以及使之更有效率。

+1

你试过了吗? ( –

+1

它应该工作,但你需要'$ all_objects [...]'而不是'()'...... – gahooa

回答

2

如果没有进一步依赖于这些对象,你可以简单地做

$className = $object->type; 
$instance = new $className; 

如果您需要更复杂的创建逻辑,你可以把Lambda表达式的创建代码,并呼吁那些话,例如

$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)); 

或者你创建一个工厂对象,并把一个开关/箱到它:

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?

+0

哎呀,你甚至可以做'$ instance = new $ object-> type;'。 –

+0

尽管如此,还是要用* __ autoload * -ing和区分大小写的文件系统来解决这个问题。 (至少对于第一种方法;)) – Yoshi

0

制作的$all_objects数组会造成更多的问题。当你从那里得到一个元素时,它就是一个引用,所以每次你访问一个元素时,它都会和你上次访问元素一样。 (例如:http://codepad.org/Z4B7glk9

而是尝试这样的事情(类名在PHP是不区分大小写):

$object_new = new $object->type(); 

DEMO:http://codepad.org/Hq09jkHz

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类。

+0

我想他只是想用一个字符串作为名称来创建一个类的实例。我不认为他需要制作所有课程的实例。 –