在 PHP 中从变量实例化类?如果使用命名空间

2022-08-30 06:38:26

我知道这个问题听起来很模糊,所以我会用一个例子让它更清楚:

$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()的情况下做到这一点?


答案 1

首先将类名放入变量中:

$classname=$var.'Class';

$bar=new $classname("xyz");

这通常是你会看到的那种包裹在工厂模式中的东西。

有关更多详细信息,请参阅命名空间和动态语言功能


答案 2

如果使用命名空间

在我自己的发现中,我认为最好提到你(据我所知)必须声明类的完整命名空间路径。

我的类.php

namespace com\company\lib;
class MyClass {
}

索引.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;

推荐