从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