为了账号安全,请及时绑定邮箱和手机立即绑定

从PHP中的变量实例化一个类?

从PHP中的变量实例化一个类?

PHP
慕码人8056858 2019-11-11 14:10:46
我知道这个问题听起来很模糊,因此我将通过一个示例来使其更加清楚:$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(),有没有办法做到这一点?
查看完整描述

3 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

首先将类名放入变量中:


$classname=$var.'Class';


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

这通常是您将以Factory模式包装的东西。

查看完整回答
反对 回复 2019-11-11
?
森林海

TA贡献2011条经验 获得超2个赞

如果您使用命名空间

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


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;


查看完整回答
反对 回复 2019-11-11
?
互换的青春

TA贡献1797条经验 获得超6个赞

如何也传递动态构造函数参数

如果要将动态构造函数参数传递给该类,则可以使用以下代码:


$reflectionClass = new ReflectionClass($className);


$module = $reflectionClass->newInstanceArgs($arrayOfConstructorParameters);

有关动态类和参数的更多信息


PHP> = 5.6

从PHP 5.6开始,您可以使用Argument Unpacking进一步简化此操作:


// The "..." is part of the language and indicates an argument array to unpack.

$module = new $className(...$arrayOfConstructorParameters);

感谢DisgruntledGoat指出这一点。


查看完整回答
反对 回复 2019-11-11
  • 3 回答
  • 0 关注
  • 1241 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信