Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.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/4/oop/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_Multiple Inheritance - Fatal编程技术网

Php 奇怪的多重继承的优雅替代品

Php 奇怪的多重继承的优雅替代品,php,oop,multiple-inheritance,Php,Oop,Multiple Inheritance,我不能说这是一个问题,但更多的是一个意见要求,我相信澄清这一问题会使许多其他人受益 以下是我的实际案例: 我有一个名为DataExchangeService的抽象类和许多扩展这个抽象类的子类(这是我的MVC框架中的基本控制器类)。处理数据定义(用户、类型、部分等)的管理模块在大多数情况下都具有100%相似性的添加、编辑、删除、列表方法。我知道这一点,因为我只使用搜索和替换来复制它们。现在问题不在于我的DateExchangeService子类都处理数据定义,所以有足够多的情况下我不需要CRUD方

我不能说这是一个问题,但更多的是一个意见要求,我相信澄清这一问题会使许多其他人受益

以下是我的实际案例:

我有一个名为DataExchangeService的抽象类和许多扩展这个抽象类的子类(这是我的MVC框架中的基本控制器类)。处理数据定义(用户、类型、部分等)的管理模块在大多数情况下都具有100%相似性的添加、编辑、删除、列表方法。我知道这一点,因为我只使用搜索和替换来复制它们。现在问题不在于我的DateExchangeService子类都处理数据定义,所以有足够多的情况下我不需要CRUD方法

多重继承将在另一个类中定义这些CRUD方法及其行为,并在需要时扩展这两个类,但我确实认为这是一个棘手的问题,我不使用它(+PHP没有这样的功能)。那么,最佳做法是什么

以下是我想到的方法:

案例A
  • 定义一个将所有这些方法参数化的CRUDHandler类

  • 在需要的地方创建CRUDHandler类型的属性,并实现CRUD接口,强制我使用这些方法

  • 在实现方法的主体中,我添加了如下内容:

  • 公共函数编辑($params){ $this->params=$params; $this->CRUDHandler->handle(“编辑”,$this); } (在PHP中,这可以通过
    \u call()
    magic方法完成。)

    案例B
  • 将类CRUDHandler定义为扩展基本DataExchangeService

  • 定义特定类型的DataExchangeService时(例如 UsersExchangeService)而不是扩展DataExchangeService,而是扩展CRUDHandler, 这样,当你需要的时候,你就能得到你想要的一切

  • 那么,对于这种多重继承方法还有其他的看法吗


    谢谢

    目前有一种流行的思维方式说“谢谢”。Google上有太多的信息,无法在这里一一列出,但我们可以说,除了偶尔出现的抽象基类之外,我已经2-3年没有使用过继承了

    其主要思想是,任何给定的类都将依赖于其他类,而不是扩展允许它提供所需功能的基类。事实上,为了保持一致,它将依赖于接口,这些接口提供一个契约,声明它们将执行一个功能

    然后,您的控制器类将传递服务/组件,并将其委托给这些服务/组件,以便完成特定的作业

    注意,你也可能走得太远。如果您有一个依赖于大量外部服务的类,特别是如果不是该类上的每个公共方法最终都使用了所有这些服务,那么实际上您可能毕竟有两个类。也就是说,您的控制员通过执行多个工作“违反”了单一责任原则。对于web框架中的控制器来说,这尤其容易发生意外,因为它们鼓励这样做

    在这一点上,我认为阅读以下内容是明智的:

    • 反转控制容器(例如和我个人最喜欢的:)

    哦,天哪,我的答案甚至与PHP有关吗?我不相信有一个StructureMap.PHP项目正在进行中。。。 public function edit($params) { $this->params = $params; $this->CRUDHandler->handle("edit", $this); }