所以我很难绕过这个没有多重继承的PHP概念。
我有一个想法,我抽出了我想要做的事情:
Loop extends LoopHelper <-> [ Single, Query, Page] *
**LoopHelper would extend each class in the brackets.
注意 :( *)这个想法是:括号中的任何类都从循环助手扩展,其中循环助手从括号中的任何类扩展(显然不可能,请继续阅读)
这个想法是Loop可以抽象出很多逻辑。但是既然我们都知道PHP不支持多重继承(There is this hack),我正在寻找另一种方法来做到这一点,所以Loop可以通过一个(或多个)父进程来获得访问Single.php
,Query.php
和Page.php
而无需实例化它们......
有一种有效的方法吗?还是我疯了?
我在Loop
中所做的是创建一个initilize_helper()
方法,将所有这三个类实例化为三个单独的类级变量,然后可以使用它们调用所需的方法。 (这是不洁净的,并将Single
,Query
和Page
类与Loop
相联系(自Single
,Query
和{{1从Page
)
我提出的这个想法存在一些明显的缺陷,我想要的但不认为我能得到。
LoopHelper
将选项传递给Loop($options)
,然后将它们分发到每个“扩展类”(注意引号),依次注意(例如,&lt; - &gt;)循环可以通过LoopHelper
问题,没有多重继承,没有语言(我知道,如果我错了请纠正我)允许双向继承,所以$this
< / p>
在一天结束时,我的期望是:
LoopHelper extends from Single, Single extends from LoopHelper
应该可以调用任何Loop
,Single
或Query
类方法,同时确保,例如,如果您传入选项数组,那些选项通过某种“桥”传递给三个类中的每一个,没有什么应该依赖于任何但“桥”,其中“桥”如果需要,可以是多个班级。
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;类继承有关。如果接口是要走的路,请解释我在这种情况下如何实现它们。
答案 0 :(得分:2)
如果您使用php&gt; = 5.4,则可以使用特征:
class Loop {
use Single, Query, Page;
}
编辑:对于旧版本的php,你正在寻找的是“mixins”,这是一种特征的模拟。有几种方法可以做到这一点,但没有一种方法是完美的,但如果你搜索这个关键词,肯定能找到适合你需求的东西。