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 - Fatal编程技术网

Php 避免对象多重继承

Php 避免对象多重继承,php,oop,Php,Oop,我正在创建一个表单生成器,实际上我正在处理一个特定的元素:duplicableement 表单可以包含一个特殊的容器(DuplicableContainer),它使用jQuery插件()复制自身 为了实现这一点,replicablecontainer只能在其子级中包含duplicablelement,因为它们是许多特定于它们的东西 问题是php不允许多重继承。(应与php“Traits”一起使用,但实际上不受支持)。我无法使DuplicableTextBox同时扩展DuplicableFormE

我正在创建一个表单生成器,实际上我正在处理一个特定的元素:
duplicableement

表单可以包含一个特殊的容器(
DuplicableContainer
),它使用jQuery插件()复制自身

为了实现这一点,
replicablecontainer
只能在其子级中包含
duplicablelement
,因为它们是许多特定于它们的东西

问题是php不允许多重继承。(应与php“Traits”一起使用,但实际上不受支持)。我无法使
DuplicableTextBox
同时扩展
DuplicableFormElement
和正常的
TextBox
元素

我希望我说得够清楚了


编辑:即使有“Traits”,问题仍然存在,我也找不到一个干净的解决方案。

DuplicableElement是否特别需要成为类?如果对象的公共接口很重要,那么可以将
duplicablelement
改为接口。一个类可以扩展一个类并同时实现多个接口。

您还可以将行为/插件注入元素中,提供traits的功能,但不需要官方支持

<?php
class Car {
  public $behaviors = array();

  public function __call($method, $params) {
    foreach($this->behaviors as $behavior) {
      if (method_exists($behavior, $method)) {
        return call_user_func_array(array($behavior, $method), $params);
      }
    }
  }
}

class Engine {
  public function start() { echo 'Started'; }
}

$car = new Car;
$engine = new Engine;
$car->behaviors[] = $engine;
$car->start(); // Started

+1不错的技术。它是某种透明包装器还是有正式名称?看起来唯一的解决方案不是吗?谢谢这是你的想法:事实上这看起来不错,但不是真的:如果你从一个继承类实例调用一个对象方法,而这个方法调用另一个方法,它将始终调用同一对象的方法,即使它在前面的另一个对象中被重新定义。@traits也会这样做。OOP的许多方面以这样或那样的方式隐藏了一些功能或执行。这是对OO的众多批评之一,而不是特性或我的特殊解决方案。像一个好的调试器这样的工具将引导您完成继承层次结构和神奇的方法执行。已经考虑过了,但它需要一个类来声明其中实现的方法。