2012-06-15 57 views
1

我使用字符串數組動態地實例化另一個類中的對象,但是我收到錯誤(大概是從自動加載器)。 例:在php中動態實例化

$inputs=array('class1(1,5)','class2('a','b')); 
$objectArray=array(); 
foreach($inputs as $input) 
    $objectArray[]=new $input; 

我實例使用與所述聲明字符串數組對象的數組。我相信這是在我的自動加載器中導致不正確的引用,有沒有人有任何洞察到這一點?謝謝!

+4

那麼SO分析器似乎挑起了一個問題 –

+0

....你爲什麼要這樣做?重新思考你的設計。 – 2012-06-15 22:49:17

+1

以及stevether指出語法不正確。你需要跳過你的單引號或者使用單引號或雙引號混合來至少避免語法錯誤 – aowie1

回答

2

首先,您應該考慮使用現有的依賴注入容器實現。

但是,你想用構造函數參數來實例化類,這是什麼讓這個稍微複雜一些。事實上,你必須使用Reflection

例如:

$inputs = array(array('class'=>'class1','arguments'=>array(1,5))); 
foreach ($inputs as $description) { 
    $refClass = new ReflectionClass($description['class']); 
    $objectArray[] = $refClass->newInstanceArgs($description['arguments']); 
} 

ReflectionClass::newInstanceArgs()

+0

正是我在找的東西,謝謝! – user1287408

2

在該塊中,

foreach($inputs as $input) 
    $objectArray[]=new $input; 

$input旨在包含類你正在實例化的名字。

相反,你會傳遞古怪的東西,比如「class1(1,5)」,這當然不只是類名。

如果您需要將參數傳遞給構造函數,則需要單獨執行。例如,

foreach($inputs as $input) 
    $objectArray[]=new $input(1,5); 

會按照您的預期工作。

因此,您需要將您的類名從您的構造函數參數中拆分。不幸的是,這可能會有點混亂。除非你會一直只有兩個參數全部這些類,否則你可能會遇到麻煩。

您可能會發現自己需要使用ReflectionClass::newInstanceArgs來創建類的新實例並提供一組參數。從手冊頁修改示例調用:

foreach($inputs as $input) { 
    $class = new ReflectionClass($input); 
    $objectArray[] = $class->newInstanceArgs(array(1, 5)); 
}