PHP类在运行时动态扩展

时间:2018-02-20 11:12:41

标签: php class dynamic runtime class-extensions

是否可以在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的新对象并从旧对象复制所有变量。但这可以更优雅地完成吗?

1 个答案:

答案 0 :(得分:1)

是。有可能的。一种方法是使用anonymous classes或简单地覆盖类本身(在你的情况下/usr/bin/make test -- OK),但这意味着更多的逻辑并且它不那么干净,所以我赢了# 39;进入它。

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

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

$A

请注意,这将覆盖 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和可能eval来实现一些魔法,但是它们如此神奇地魔法我拒绝写出答案,因为它会促进这种不良行为。