我知道这个问题听起来很模糊,所以我会用一个例子说清楚:
$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()有没有办法做到这一点?
首先将classname放入变量:
$classname=$var.'Class'; $bar=new $classname("xyz");
这通常是您在工厂模式中看到的那种东西.
有关更多详细信息,请参阅命名空间和动态语言功能.
在我自己的发现中,我认为最好提一下你(据我所知)必须声明一个类的完整命名空间路径.
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;
如果要将动态构造函数参数传递给类,可以使用以下代码:
$reflectionClass = new ReflectionClass($className); $module = $reflectionClass->newInstanceArgs($arrayOfConstructorParameters);
有关动态类和参数的更多信息
从PHP 5.6开始,您可以使用Argument Unpacking进一步简化:
// The "..." is part of the language and indicates an argument array to unpack. $module = new $className(...$arrayOfConstructorParameters);
感谢DisgruntledGoat指出这一点.
class Test { public function yo() { return 'yoes'; } } $var = 'Test'; $obj = new $var(); echo $obj->yo(); //yoes