是否可以在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的新对象并从旧对象复制所有变量。但这可以更优雅地完成吗?
答案 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
来实现一些魔法,但是它们如此神奇地魔法我拒绝写出答案,因为它会促进这种不良行为。