我有几个标准类:
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来解决此问题。
答案 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);