我正在使用字符串数组动态实例化另一个类中的对象,但我收到错误(可能来自自动加载器)。前任:
$inputs=array('class1(1,5)','class2('a','b'));
$objectArray=array();
foreach($inputs as $input)
$objectArray[]=new $input;
我正在使用带有声明的字符串数组实例化一个对象数组。我相信这会导致我的自动加载器中的引用不正确,有人对此有任何见解吗?谢谢!
首先,您应该考虑使用现有的依赖注入容器实现。
但是,您想使用构造函数参数实例化该类,这使得这稍微复杂一些。事实上你必须使用Reflection
:
例如:
$inputs = array(array('class'=>'class1','arguments'=>array(1,5)));
foreach ($inputs as $description) {
$refClass = new ReflectionClass($description['class']);
$objectArray[] = $refClass->newInstanceArgs($description['arguments']);
}
在这个区块中,
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));
}