php中的动态实例化

时间:2012-06-15 22:44:40

标签: php class object dynamic

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

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

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

2 个答案:

答案 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']);
}

ReflectionClass::newInstanceArgs()

答案 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));
}