Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
改进PHP中的类结构而不是使用多重继承_Php_Oop_Design Patterns_Inheritance - Fatal编程技术网

改进PHP中的类结构而不是使用多重继承

改进PHP中的类结构而不是使用多重继承,php,oop,design-patterns,inheritance,Php,Oop,Design Patterns,Inheritance,我有一个设计问题,我的课程是这样设置的: abstract class Advertiser abstract class AdvertiserCampaign | | | | class AdvUno extends Advertiser class AdvUnoCampaign extends Advertiser

我有一个设计问题,我的课程是这样设置的:

abstract class Advertiser        abstract class AdvertiserCampaign
      |                                    |
      |                                    |
class AdvUno extends Advertiser  class AdvUnoCampaign extends AdvertiserCampaign
class AdvDos extends Advertiser  class AdvDosCampaign extends AdvertiserCampaign
class AdvTre extends Advertiser  class AdvTreCampaign extends AdvertiserCampaign
问题在于
AdvUno
AdvUnoCampaign
都需要一种特殊的身份验证方法,而其他方法则不需要这种方法。现在我已经把它放在了
AdvUno
中,但是同样地,
AdvUnoCampaign
也需要它(以及其他一些以这种方式设置的类)

  • 我不能让
    AdvUnoCampaign
    extend
    AdvUno
    ,因为PHP中没有多重继承,但也因为它通常不是一个好的、干净的设计实践
  • 如果我让
    广告客户活动
    扩展
    广告客户
    ,那么下面的所有扩展类(
    AdvUnoCampaign
    AdvDosCampaign
    ,等等)都必须实现一组与他们无关的抽象方法,并且这些方法已经在每个
    广告客户
    类中实现
简而言之,在这种情况下,最佳的设计实践是什么?我宁愿不只是将代码复制并粘贴到所有
AdvOne
类中。任何帮助或建议都将不胜感激。谢谢

被认为是一种代码味道,应该进行重构

Martin Fowler在“重构”中建议:

消除重复的一般策略是确保 层次结构指的是另一个层次结构的实例。如果使用移动方法移动字段,则层次结构 在引用类上,引用类消失

但我认为你可以更进一步。我不知道,你的决定是基于什么为每个广告商和他们的活动制作子类,但我会质疑这个决定。要遵循的一个好习惯是

你可以这样开始:

class Advertiser
{
  protected $authentication;
}

class AdvertiserCampaign
{
  protected $authentication;
}

interface AdvertiserAuthentication
{
}

class SpecialAuthenticationForAdvertiserUno implements AdvertiserAuthentication
{
}

class NoSpecialAuthenticationForOtherAdvertisers implements AdvertiserAuthentication
{
}

现在,广告商之间的第一个区别被转移到另一个类别。继续进行其他差异,直到每个广告客户只是以不同方式组成的
广告客户的对象。竞选活动也是如此。我想说得更具体一些,但如前所述,我不知道为什么你们的广告商首先都有自己的课程。

一般来说,为了解决与你们类似的问题,桥梁设计模式是常用的


DI浮现在脑海中。也许读一下这些线程:,,当然Fowler对模式总是很好:嗯,我知道并行类层次结构是一种气味。然而,在这种情况下,我这样做是因为“has-a”关系并不稳固。无论如何,这是一个复杂的案例。如果我现在的选择不太正确,我很乐意在路径变得更加清晰之后重构。现在,我做了一些与您建议的非常类似的事情,我创建了一个
广告商身份验证
对象,该对象注入了所有必要的信息,每个“Uno”广告商对象都有一个。