当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《从PHP中的变量实例化一个类?》经验,为你挑选了4个好方法。

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

$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> Paul Dixon..:

首先将classname放入变量:

$classname=$var.'Class';

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

这通常是您在工厂模式中看到的那种东西.

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


如果使用命名空间,请将当前命名空间放入字符串:`$ var = __NAMESPACE__.'\\'.$ var.'级';`
我就是这样做的.请注意,在类中,您可以使用parent和self.

2> csga5000..:
如果您使用命名空间

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

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;


需要使用命名空间创建时唯一可行的解​​决方案是您的.谢谢分享!

3> flu..:

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

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

$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指出这一点.


从PHP 5.6开始,您应该能够使用参数解包:`new $ className(... $ params)`

4> zalew..:
class Test {
    public function yo() {
        return 'yoes';
    }
}

$var = 'Test';

$obj = new $var();
echo $obj->yo(); //yoes


2ndGAB应删除此评论.自动加载与此问题无关.
推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有