1

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

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

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

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

这个想法是 Loop 可以抽象出很多它的逻辑。但是由于我们都知道 PHP 不支持多重继承(有这个 hack),我正在寻找另一种方法来做到这一点,以便 Loop 可以通过一个(或多个)父级来获得访问权限to Single.phpQuery.php并且Page.php不必实例化它们...

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

我所做的Loop是创建一个initilize_helper()方法,将所有这三个类实例化为三个单独的类级别变量,然后可以使用这些变量调用您需要的方法。(这既不干净,又将Single,QueryPage类与Loop(since Single, Queryand Pageextend from LoopHelper)

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

Loop($options)传递选项LoopHelper,然后将它们分发给每个“扩展类”(注意引号),然后(注意示例中的 <->)循环可以通过 Single、Query 或 Page 调用函数$this

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

归根结底,我期望的是:

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

//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 默认使用父类构造函数。背部练习我知道,但这只是一个例子。

依赖注入看起来很有希望,但它是我真正需要的 - 在这样的情况下如何实现它?- 除了桥牌课程之外,没有任何东西取决于任何东西。

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

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

更新

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

4

1 回答 1

1

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

class Loop {
  use Single, Query, Page;
}

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

于 2013-10-07T19:10:19.957 回答