1

我正在使用字符串数组动态实例化另一个类中的对象,但我收到错误(可能来自自动加载器)。前任:

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

我正在使用带有声明的字符串数组实例化一个对象数组。我相信这会导致我的自动加载器中的引用不正确,有人对此有任何见解吗?谢谢!

4

2 回答 2

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()

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

会按您的预期工作。

因此,您需要将类名与构造函数参数分开。不幸的是,这可能会有点混乱。除非你总是并且只有两个论点来处理所有的类,否则你可能会遇到麻烦。

您可能会发现自己需要使用ReflectionClass::newInstanceArgs来创建一个类的新实例并提供一组参数。从手册页修改示例调用:

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