2012-05-16 211 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

我想他只是想用一個字符串作爲名稱來創建一個類的實例。我不認爲他需要製作所有課程的實例。 –