PHP中的配置和继承链

时间:2013-09-18 15:47:10

标签: php oop inheritance configuration

我有几个标准类:

abstract class Parent {}
class Child1 extends Parent {}
class Child2 extends Parent {}

Parent类包含两个子类共有的逻辑,但每个子类都有自己的附加逻辑。

对于我的每个客户,此逻辑可以配置。所以对于任何特定的客户,我可能有:

abstract class ClientParent {}
class ClientChild1 extends ClientParent {}
class ClientChild2 extends ClientParent {}

我遇到的问题是如何将标准类中的逻辑转换为这些逻辑类。第一种方法是这样的:

abstract class ClientParent extends Parent {}

好的,现在我在所有特定于客户端的类中都有标准的父逻辑。大。但是子类已经扩展ClientParent,所以我们不能为它们做同样的事情。我的“解决方案”就是这样做:

abstract class Parent {}
class Child1 extends ClientParent {}
class Child2 extends ClientParent {}

abstract class ClientParent extends Parent {}
class ClientChild1 extends Child1 {}
class ClientChild2 extends Child2 {}

有;现在所有适当的逻辑都传下来,每个人都很高兴。除了现在我的标准类耦合到特定客户端。由于我有很多客户,这显然不好。

我在这里干什么?有没有办法通过继承单独解决这个问题,还是应该研究更复杂的配置注入策略?

修改

我使用的是PHP 5.3,因此我无法使用traits来解决此问题。

1 个答案:

答案 0 :(得分:1)

PHP不支持多重继承,这是我认为你试图在这里进行近似的。但它支持(截至5.4)traits,在许多情况下可以为您提供类似的功能。

trait ParentTrait {
   public function someUsefulMethod(){/*...*/};
   public function someOtherUsefulMethod(){/*...*/};
}

abstract class ClientParent(){}

class ClientChild1 extends ClientParent {
      use ParentTrait;
}

$clientChild1 = new ClientChild1();
$clientChild1->someUsefulMethod();

另一个选择是使用合成,可能是因为你的问题采用策略模式会起作用。

class SuperWidget extends Widget{
    private $dataStrategy;

    public function __construct(DataStrategy $strategy){
         $this->dataStrategy = $strategy;
    }

    // do this if you need to expose the functionality. 
    public function getData(){
        return $this->dataStrategy->getData();
    }

    // or if you are just using it in your class
    public function renderWidget($option){
        $data = $this->dataStrategy->getData($option);
        // use the data to render the widget;
        return $renderedWidget;
    }
}

$dataStrategy = JsonDataStrategy("http://data.source.url/jsonService.php");
$widget = new SuperWidget($dataStrategy);