【发布时间】:2020-10-10 22:12:08
【问题描述】:
是否可以覆盖单个实例的方法?例如
class test
{
protected function print()
{
echo "printed from old method";
}
}
$a= new test();
can i overrride method "print" only for object $a?
e.g. $a->test=function(){echo "printed with new method";}
我知道这有点奇怪,但在我的项目中,一个公共类(“base”)是许多其他类的一部分,每个类都需要稍微修改版本的“base”。我只需要每次覆盖一种方法。尽量避免为此创建大量的“base”子类。
附言我已经看到你提议的solution,但它对我不起作用。 php版本为7.4.3
这是我的代码:
class nodeGroup
{
public function test()
{
echo "internal";
}
}
$a= new nodeGroup();
$a->test = (function() {
echo "external";
})->bindTo($a);
$a->test();
result is "internal"
【问题讨论】:
-
这不违反 OCP 吗?
-
你考虑过使用接口吗?
-
我认为正确的做法是要么创建一个从原始类继承并覆盖方法的新类,要么使用接口。另一种选择是添加一个成员,该成员是指向要调用的函数的指针,如果它不为假,则在方法中调用它,否则,使用普通方法函数。我认为这违反了最小意外的政策,并且尝试覆盖实例对象上的方法肯定会这样做。
标签: php oop overriding