【问题标题】:PHP Class dynamically extending in runtimePHP 类在运行时动态扩展
【发布时间】:2018-07-30 17:45:06
【问题描述】:

是否可以在 PHP 中动态扩展类对象?最优雅的方式是什么?

一些示例代码进一步解释:

class BasicClass {

    private $variable;

    public function BasicFunction() {
        // do something
        $this->variable = 10;
    }

}

class ExtendedClass extends BasicClass {

    public function ExtendedFunction() {
        // do something else with basic class variable
        return $this->variable/2;
    }

}

$A = new BasicClass();

If(condition for extension){

    // A should be of class ExtendedClass
    // and the current class variables should be kept
    // ... insert the magic code here ...
    // afterwards we would be able to use the ExtendedFunction with the original variables of the object

    $A->ExtendedFunction();

}

解决此问题的一种方法是创建 ExtendedClass 的新对象并从旧对象复制所有变量。但这可以做得更优雅吗?

【问题讨论】:

    标签: php class dynamic runtime class-extensions


    【解决方案1】:

    是的。有可能的。一种方法是使用anonymous classes 或简单地覆盖类本身(在您的情况下为$A),但这意味着更多的逻辑并且它不是那么干净,所以我不会进入它。

    注意:在 PHP 7 中添加了对匿名类的支持。

    使用上面的示例,我们可以编写以下代码(我更改了属性的可见性以便能够在扩展类中使用它。我建议您添加 getter 而不是更改可见性) .

    class BasicClass {
    
      public $variable;
    
      public function BasicFunction() {
        // do something
        $this->variable = 10;
      }
    
    }
    
    class ExtendedClass extends BasicClass {
    
      public function ExtendedFunction() {
        // do something else with basic class variable
        return $this->variable / 2;
      }
    
    }
    
    $A = new BasicClass();
    
    if (TRUE) {
    
      // A should be of class ExtendedClass
      $A = new class extends ExtendedClass {
    
      };
    
      $A->ExtendedFunction();
    }
    

    请注意,这将覆盖 $A。您仍将拥有所有可用的方法,因为这样做不会丢失继承。


    显然,无论您采用哪种方法都不是最干净的方法。

    我的答案是正确的,但如果您要编辑您的问题并提供更多详细信息,说明您希望通过这样做实际实现的目标,也许另一种方法更合适。


    您还可以使用evalReflection 实现一些魔法,但它们太神奇了,我拒绝写答案,因为它促进了这种不良做法。

    【讨论】:

      猜你喜欢
      • 2012-05-15
      • 2013-10-14
      • 2017-08-15
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 2013-09-20
      • 2016-05-11
      • 1970-01-01
      相关资源
      最近更新 更多