1

文字列の配列を使用して別のクラス内でオブジェクトを動的にインスタンス化していますが、(おそらくオートローダーから) エラーが発生しています。元:

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

宣言で文字列の配列を使用して、オブジェクトの配列をインスタンス化しています。これにより、オートローダーで誤った参照が発生していると思いますが、これについて何か洞察を持っている人はいますか? ありがとう!

4

2 に答える 2

2

まず、既存の Dependency Injection Container 実装の使用を検討する必要があります。

ただし、コンストラクター引数を使用してクラスをインスタンス化する必要があるため、これが少し複雑になります。実際には、次を使用する必要があります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()

于 2012-06-15T22:51:35.187 に答える
2

このブロックでは、

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

$inputインスタンス化するクラス名を含む文字列を意図しています。

代わりに、「class1(1,5)」のような奇抜なものを渡しています。これは、クラス名だけではないことは間違いありません。

コンストラクターに引数を渡す必要がある場合は、個別に行う必要があります。例えば、

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

あなたが期待するように動作します。

したがって、クラス名をコンストラクタ パラメータから分割する必要があります。残念ながら、これは少し厄介になる可能性があります。すべてのクラスに対して常に 2 つの引数しか持たない場合を除き、問題が発生する可能性があります。

ReflectionClass::newInstanceArgsおそらく、クラスの新しいインスタンスを作成し、引数の配列を提供するためにを使用する必要があることに気付くでしょう。マニュアル ページの呼び出し例を変更します。

foreach($inputs as $input) {
    $class = new ReflectionClass($input);
    $objectArray[] = $class->newInstanceArgs(array(1, 5));
}
于 2012-06-15T22:52:14.460 に答える