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…)。无需在此处创建
公共
属性。