Php 覆盖另一个类调用的类中的函数
对于给定的库,如下所示:Php 覆盖另一个类调用的类中的函数,php,class,oop,Php,Class,Oop,对于给定的库,如下所示: class boss { private $sub; public function __construct() { $this->sub = new subclass(); } } class subclass { public function dofoo() { echo 'subclass'; } } 由于种种原因,我无法修改库中的任何内容 class newboss exte
class boss {
private $sub;
public function __construct() {
$this->sub = new subclass();
}
}
class subclass {
public function dofoo() {
echo 'subclass';
}
}
由于种种原因,我无法修改库中的任何内容
class newboss extends boss {
public function __construct() {
// do stuff
parent::__construct();
}
// extend some other boss methods
function dofoo() {
echo 'newboss - ';
parent::dofoo();
}
}
$x = new newboss;
$x->dofoo();
在newboss
中扩展函数可以像预期的那样直接工作。我需要扩展子类
,特别是子类->dofoo()
,这样输出将是newboss-subclass
,而不是newboss
。
当然,调用parent::dofoo()
永远不会起作用,因为我没有扩展子类
,但我希望能得到一些好的建议/想法来解决这个问题
多谢各位
使现代化
更清楚一点,类boss调用subclass()
并将其存储在private$sub
中以供使用。boss中有多个调用,如$this->sub->dofoo()
,它还需要能够使用我的扩展版本。您可以使用该模式并根据需要添加方法:
class Facade
{
$a = new newboss;
$b = new subclass;
function dofoo() {
echo 'newboss - ';
$b->dofoo();
}
}
客户端代码:
$x = new Facade;
$x->dofoo();
由于您需要扩展子类,因此只能使用与boss中相同的子类实例(public或private)。
类boss使用委托,是继承的替代方法:
class newboss extends boss {
public $sub;
public function __construct() {
// do stuff
parent::__construct();
$this->sub = new subclass();
}
// extend some other boss methods
function dofoo() {
echo 'newboss - ';
$this->sub->dofoo();
}
}
由于您无法修改库,并且
子类
不扩展boss
,因此我不相信有什么方法可以满足您的需要。这两个类没有关系。这也是我的想法,但我仍然希望有一个(可能是黑客的方式)围绕着…@smtw,如果PHP支持多重继承的话,也许,但是它。看起来很有趣,但这不会破坏它吗?因为类boss
调用subclass()
并将其存储在private$sub
中以供使用。在boss
中有多个调用,如$this->sub->dofoo()
,然后它们会忽略我扩展的'dofoo()。还是我错了?boss
不会崩溃,因为它对新的Facade
类一无所知。但出于同样的原因,它也无法调用新的dofoo
方法。这个示例甚至没有编译。我喜欢这个想法,并将进一步研究。在快速测试中,它不起作用。特别是因为subclass()
在boss
中被调用,带有几个参数,比如$this->sub=new subclass($this,$this->x…)代码>。无需在此处创建公共
属性。