PHP 中的多重继承还是有更好的方法


Multiple Inheritance in PHP or is there a better way?

所以我很难绕过PHP没有多重继承的概念。

有一个想法,我画出了我想这样做的地方:

Loop extends LoopHelper <-> [ Single, Query, Page] *
**LoopHelper would extend each class in the brackets.

注意:(*(这个想法是:括号中的任何类都从循环助手扩展,而循环助手从括号中的任何类扩展(显然不可能,请继续阅读(

这个想法是Loop可以抽象出它的很多逻辑。但是由于我们都知道 PHP 不支持多重继承(有这个技巧(,我正在寻找另一种方法来做到这一点,以便 Loop 可以通过一个(或多个(父级来访问Single.phpQuery.phpPage.php,而无需实例化它们......

有没有有效的方法可以做到这一点?还是我疯了?

我在Loop所做的是创建一个initilize_helper()方法,该方法将所有这三个类实例化为三个单独的类级变量,然后可以使用调用所需的方法。(这既不干净,又将SingleQueryPage类耦合到Loop(因为SingleQueryPageLoopHelper扩展(

提出的这个想法有一些明显的缺陷,我想要但我认为我无法得到的东西。

Loop($options)将选项传递给LoopHelper然后将它们分发给每个"扩展类"(注意引号(,依次(注意示例中的<->( 循环可以通过$this调用来自单一、查询或页面的函数

问题,没有多重继承,没有语言(我知道,如果我错了,请纠正我(允许双向继承,所以LoopHelper extends from Single, Single extends from LoopHelper

归根结底,我的期望是:

Loop 应该能够调用任何SingleQueryPage类方法,同时确保,例如,如果你传入一个选项数组,这些选项通过某种"桥"传递到三个类中的每一个,除了"桥接"之外,什么都不应该依赖于任何东西, 如果需要,"桥"可以是多个类。

//Loop --> ($options) -> __Some_Kind_Of_Bridge __ --> ($options) -> [Single, Query, Page]
class Loop extends Some_Kind_Of_Bridge{
    public function call_methods(){
        $this->some_page_method();
        $this->some_query_method();
        $this->some_single_method();
    }
}
$loop = new Loop(array('some', 'values'));
$loop->call_methods();

你会注意到我不是在Loop中创建构造函数,如果你不创建一个,php 默认情况下将使用父类构造函数。我知道回修,但这只是一个例子。

依赖注入看起来很有前途,但它是我真正需要的吗 - 在这种情况下如何实现它? - 除了桥接类之外,什么都不依赖于任何东西。

解决这个既OO又干净的问题的最简单方法是什么?(几乎没有耦合(。

他们有一些模式是我应该看的吗?

更新

这篇文章没有反映可以扩展多个类的接口,这与 clas->class 继承有关。如果接口是要走的路,请解释我在这种情况下如何实现它们。

如果使用 php>= 5.4,则可以使用特征:

class Loop {
  use Single, Query, Page;
}

编辑:对于旧版本的php,您正在寻找的称为"mixins",这是对特征的模仿。有几种方法可以做到这一点,但没有一种是完美的,但是如果您搜索此关键字,您一定会找到适合您需求的东西。