PHP可以将类名称作为字符串实例化一个对象吗?


Answers:


133

是的,当然。

$className = 'MyClass';
$object = new $className; 

7
太好了,在问问嘻嘻之前,我应该先测试一下。谢谢!
user135295

2
@user-太正确了。我想知道为什么我直接来到SO而不是做最低限度的工作?洛尔

2
实际上,事实并非如此明显。我知道在Java中这叫做反射,但是相比之下,这非常简单。
巴蒂斯·阿隆

4
如果clsss在名称空间中,请使用此$ class ='PrintData \\'。$ class; 返回新的$ class();
Darius.V 2015年

2
另外,如PHP文档所述,如果要实例化的类在名称空间内,则必须指定FQN(完全限定名称)。例如,我本人位于“ App \ Http \ Controllers”的命名空间中,并且我有一个字符串$ string ='App \ Models \ Task'; 我以为,如果我尝试实例化字符串,它将损坏,但实际上,您不需要在开头添加\。
马特·基兰


4

如果您的班级需要参数,则应该这样做:

class Foo 
{
   public function __construct($bar)
   {
      echo $bar; 
   }
}

$name = 'Foo';
$args = 'bar';
$ref = new ReflectionClass($name);
$obj = $ref->newInstanceArgs(array($args));

3

也是静态的:

$class = 'foo';
return $class::getId();

这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方发表评论。-评分
Blackbam

@Blackbam相关的相关补充答案。请仅在有用时发表评论。
Andrew Atkinson

的确,它无论如何基本上都能正常工作,对您的答案进行一点解释就可以了。问题是“ PHP可以实例化对象”,但是访问静态成员函数不是对象访问。
Blackbam'7

0

您可以通过将类名/方法存储在诸如数据库之类的存储中来进行一些动态调用。假设该类对错误具有弹性。

sample table my_table
    classNameCol |  methodNameCol | dynamic_sql
    class1 | method1 |  'select * tablex where .... '
    class1 | method2  |  'select * complex_query where .... '
    class2 | method1  |  empty use default implementation

等等。然后在您的代码中使用数据库返回的用于类和方法名称的字符串。您甚至可以为您的类存储sql查询,并且可以根据自己的想象来存储自动化级别。

$myRecordSet  = $wpdb->get_results('select * from my my_table')

if ($myRecordSet) {
 foreach ($myRecordSet   as $currentRecord) {
   $obj =  new $currentRecord->classNameCol;
   $obj->sql_txt = $currentRecord->dynamic_sql;
   $obj->{currentRecord->methodNameCol}();
}
}

我使用这种方法来创建REST Web服务。


1
而且,如果我设法为您的数据库注入任何数量的类和方法,我将拥有您所有的其余API ....荣誉!请不要使用此代码,这非常危险!
詹姆斯·基普林
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.