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

时间:2013-10-07 19:02:38

标签: php inheritance

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

我有一个想法,我抽出了我想要做的事情:

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

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

这个想法是Loop可以抽象出很多逻辑。但是既然我们都知道PHP不支持多重继承(There is this hack),我正在寻找另一种方法来做到这一点,所以Loop可以通过一个(或多个)父进程来获得访问Single.phpQuery.phpPage.php而无需实例化它们......

有一种有效的方法吗?还是我疯了?

我在Loop中所做的是创建一个initilize_helper()方法,将所有这三个类实例化为三个单独的类级变量,然后可以使用它们调用所需的方法。 (这是不洁净的,并将SingleQueryPage类与Loop相联系(自SingleQuery和{{1从Page

延伸

我提出的这个想法存在一些明显的缺陷,我想要的但不认为我能得到。

LoopHelper将选项传递给Loop($options),然后将它们分发到每个“扩展类”(注意引号),依次注意(例如,&lt; - &gt;)循环可以通过LoopHelper

从单个,查询或页面调用函数

问题,没有多重继承没有语言(我知道,如果我错了请纠正我)允许双向继承,所以$this < / p>

在一天结束时,我的期望是:

LoopHelper extends from Single, Single extends from LoopHelper应该可以调用任何LoopSingleQuery类方法,同时确保,例如,如果您传入选项数组,那些选项通过某种“桥”传递给三个类中的每一个,没有什么应该依赖于任何“桥”,其中“桥”如果需要,可以是多个班级。

Page

你会注意到我没有在//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(); 中创建一个构造函数,php会默认使用父类构造函数,如果你不创建一个。我知道,这只是一个例子。

依赖注入看起来很有希望,但它是我真正需要的 - 如何在这样的情况下实现? - 没有什么比桥梁类更重要了。

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

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

更新

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

1 个答案:

答案 0 :(得分:2)

如果您使用php&gt; = 5.4,则可以使用特征:

class Loop {
  use Single, Query, Page;
}

编辑:对于旧版本的php,你正在寻找的是“mixins”,这是一种特征的模拟。有几种方法可以做到这一点,但没有一种方法是完美的,但如果你搜索这个关键词,肯定能找到适合你需求的东西。