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

我知道这个问题听起来很模糊,所以我举个例子来说明:

$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 ()来做这件事?

149837 次浏览

首先将 classname 放入一个变量:

$classname=$var.'Class';


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

这通常是您在 Factory 模式中看到的封装类型。

详情请参阅 名称空间和动态语言特性

class Test {
public function yo() {
return 'yoes';
}
}


$var = 'Test';


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

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

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

$reflectionClass = new ReflectionClass($className);


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

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

PHP > = 5.6

从 PHP 5.6开始,您可以使用 解包装更加简化:

// The "..." is part of the language and indicates an argument array to unpack.
$module = new $className(...$arrayOfConstructorParameters);

感谢“不满的山羊”指出了这一点。

如果使用名称空间

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

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;

我建议使用 call_user_func()call_user_func_arrayphp 方法。 你可以在这里查看(Call _ user _ func _ arrayCall _ user _ func)。

例子

class Foo {
static public function test() {
print "Hello world!\n";
}
}


call_user_func('Foo::test');//FOO is the class, test is the method both separated by ::
//or
call_user_func(array('Foo', 'test'));//alternatively you can pass the class and method as an array

如果您有要传递给方法的参数,那么使用 call_user_func_array()函数。

例子。

class foo {
function bar($arg, $arg2) {
echo __METHOD__, " got $arg and $arg2\n";
}
}


// Call the $foo->bar() method with 2 arguments
call_user_func_array(array("foo", "bar"), array("three", "four"));
//or
//FOO is the class, bar is the method both separated by ::
call_user_func_array("foo::bar"), array("three", "four"));