【问题标题】:Using methods to access classes and the instantiate them使用方法访问类并实例化它们
【发布时间】:2013-04-20 12:24:04
【问题描述】:

我已将要实例化的类存储在一个可通过 get 和 set 方法访问的变量中:

private $myClass;

public function setClass($myClass) {$this->myClass = $myClass;}
public function getClass() {return $this->myClass;}

现在我想用 get 方法实例化这个类:

$instance = new $getClass()();

并且还可以使用它的一些静态属性:

$staticAttr = $getClass()::$attr;

但是这两行都会引发错误,我想我已经找到了解决方案,但我真的不确定,我觉得我的问题是根本不了解如何做到这一点。或者也许这只是一种糟糕的做法,因此非常气馁?我应该如何最好地解决这个问题?

【问题讨论】:

  • 一些关于你为什么这样做的背景会有所帮助。
  • 我有一个“组”类,可以根据需要实例化所有其他类的负载。我试图概括它以节省重写任何代码。
  • 我觉得这个想法真的很糟糕,应该劝阻。你应该解释你将要做什么。我认为涉及的动态访问太多了:指向动态实例化对象的动态类名,具有动态访问的静态属性...您的类可能做了太多不同的事情,应该分成几部分。
  • 嗨,斯文,你应该这么说很有趣,因为实际上我的整个系统都是动态的。我正在研究一种完全面向对象的服务器端方法来呈现网页,但使用单个类“实体”的扩展。目前它非常粗糙,所以是的,我可能在一个类中有很多方法可以进一步扩展,它应该被分解,但是基本的“EntityGroup”类的行数少于 100 行,只是作为显示其他列表的一种方式实体。

标签: php class methods get instantiation


【解决方案1】:

PHP 的语法不允许这样做。为了让它工作,你只需要先将类名存储到一个变量中:

$class_name = $obj->getClass();
$instance = new $class_name();

访问静态属性也是如此:

$class_name = $obj->getClass();
$staticAttr = $class_name::$attr;

【讨论】:

    【解决方案2】:

    这是错误的

    $instance = new $getClass()();
    

    改为这样做

    $getClass = "classname";
    
    $instance = new $getClass();
    

    对于静态函数执行此操作

    $getClass::getMethod();
    

    对于静态成员

    $getClass::$attr;
    

    【讨论】:

      【解决方案3】:

      将代码调整为工作对象:

      class someObject {
      
        private $myClass;
      
        public function setClass($myClass) {$this->myClass = $myClass;}
        public function getClass() {return $this->myClass;}
      
      }
      

      样本

      $a = new someObject();
      
      $a->setClass(new stdClass());
      var_dump($a->getClass());
      

      您可以访问$a->getClass()->property,获取静态属性:

      class Foo {
        public static $a = 'bar';
      }
      
      $a->setClass(new Foo());
      $class = $a->getClass();
      
      var_dump($class::$a);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-09
        • 2016-05-20
        • 1970-01-01
        • 1970-01-01
        • 2016-01-15
        相关资源
        最近更新 更多