我使用字符串数组动态地实例化另一个类中的对象,但我收到错误(可能来自自动加载器)。 例如:
$inputs=array('class1(1,5)','class2('a','b'));
$objectArray=array();
foreach($inputs as $input)
$objectArray[]=new $input;
我使用带声明的字符串数组实例化一个对象数组。我相信这会导致我的自动加载器中出现错误的引用,是否有人对此有任何见解?谢谢!
答案 0 :(得分: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']);
}
答案 1 :(得分: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));
}