可以使用类方法中的类名属性(在一行代码中)实例化 PHP 实例吗?

Posted

技术标签:

【中文标题】可以使用类方法中的类名属性(在一行代码中)实例化 PHP 实例吗?【英文标题】:Possible to instantiate a PHP instance using a class name property from within a class method (in one line of code)? 【发布时间】:2015-04-17 15:29:40 【问题描述】:

我希望能够使用存储在另一个类的属性中的类名来实例化一个类,并且我想用一行代码来做到这一点,就像下面代码中的 cmets 一样(它应该可以在至少一个最新版本的 php 5)。这可能吗?

<?php

class Foo 

  public function doFoo() 

    echo "foo\n";

  



class Bar 

  function __construct($className) 

    $this->className = $className;

  

  public function doBar() 

    //INSTEAD OF THESE TWO LINES...
    //$className = $this->className;
    //$instance = new $className();

    //I WOULD LIKE THIS (OR SOME OTHER) ONE-LINER TO WORK:
    $instance = $this->className();

    $instance->doFoo();

  



$bar = new Bar('Foo');
$bar->doBar();

预期输出:

foo

【问题讨论】:

您只是忘记了关键字new,例如$instance = new $this-&gt;className();(如您所愿,它适用于 PHP 版本 +5.0,请参阅:3v4l.org/H3O7X)您当前的代码将是:$instance = Foo();,它只是调用函数 Foo 另外,在你问下 3 个拼写错误或 php 版本错误的问题之前,我只能向你推荐一个快速的 google 和 SO search + 一些基本调试,顶部有错误报告您的文件:&lt;?php ini_set("display_errors", 1); error_reporting(E_ALL); ?&gt; 另外不要忘记帮助中心:***.com/help @Rizier123 你今天很成功!干得好:D @Darren 我尽力了,每天都好一点 @Rizier123 你做得很好,继续加油! 【参考方案1】:

调用函数而不是构造函数的代码中有一个明显的拼写错误,可以按如下方式修复:

$instance = new $this->className();

这就行了。

【讨论】:

以上是关于可以使用类方法中的类名属性(在一行代码中)实例化 PHP 实例吗?的主要内容,如果未能解决你的问题,请参考以下文章

day24继承

JAVA-封装-静态属性

Python_对象(实例)

内部类

python面向对象中类对象实例对象类变量实例变量类方法实例方法静态方法

类 反射