从PHP中的variables实例化类?

我知道这个问题听起来很模糊,所以我会用一个例子来说明一下:

$var = 'bar'; $bar = new {$var}Class('var for __construct()'); //$bar = new barClass('var for __construct()'); 

这是我想要做的。 你会怎么做? 我可以使用eval()像这样:

 $var = 'bar'; eval('$bar = new '.$var.'Class(\'var for __construct()\');'); 

但是我宁愿远离eval()。 有没有办法做到这一点没有eval()?

首先将类名放入一个variables中:

 $classname=$var.'Class'; $bar=new $classname("xyz"); 

这通常是你将会看到的一种工厂模式。

有关更多详细信息,请参阅命名空间和dynamic语言function 。

如何传递dynamic构造函数参数

如果要将dynamic构造函数parameter passing给类,则可以使用以下代码:

 $reflectionClass = new ReflectionClass($className); $module = $reflectionClass->newInstanceArgs($arrayOfConstructorParameters); 

有关dynamic类和参数的更多信息

PHP> = 5.6

从PHP 5.6开始,您可以通过使用参数解包来简化这一点:

 // The "..." is part of the language and indicates an argument array to unpack. $module = new $className(...$arrayOfConstructorParameters); 

感谢DisgruntledGoat指出。

如果您使用命名空间

在我自己的发现中,我认为可以提及的是(据我所知)必须声明一个类的完整命名空间path。

MyClass.php

 namespace com\company\lib; class MyClass { } 

的index.php

 namespace com\company\lib; //Works fine $i = new MyClass(); $cname = 'MyClass'; //Errors //$i = new $cname; //Works fine $cname = "com\\company\\lib\\".$cname; $i = new $cname; 
 class Test { public function yo() { return 'yoes'; } } $var = 'Test'; $obj = new $var(); echo $obj->yo(); //yoes