有没有办法在PHP中实现多重继承?

时间:2010-05-12 01:17:42

标签: php oop inheritance multiple-inheritance composition

假设我有一个父类

class parent { }

.....

这个父级有三个子类

class child1 { }

class child2 { }

class child3 { }

并且这些子类具有更小的部分,如

class child1subpar1 { }

class child1subpar2 {

       public function foo() {
          echo "hi";
       }

}

class child2subpar1 { }

class child2subpar2 { }

现在,如何总结这个整体像

class child1 extends child1subpar1, child1subpar2 { }
class child2 extends child2subpar1, childsubpar1 { }

class parent extends child1,child2,child3 { }

我需要在其继承的类中执行方法并执行类似这样的操作

$ objparent =新父母; $ objparent - > FOO();

6 个答案:

答案 0 :(得分:2)

不,但多重继承通常被认为是一种不好的做法。你应该偏爱合成,所以你只需要使用你想在类中继承的类的实例。

现在当我再次调查你的问题时,它甚至不是遗传问题,你应该使用构图。也许如果您提供了更多关于您希望该课程的详细信息,我们应该更准确地回答。

更新:

您需要为要使用的每个类的方法创建一个方法 - 它称为Facade设计模式。或许你可能不知道你可以像这样调用内部对象的方法:

$parent->subObject->subSubObject->wantedMethod();

立面图案:

http://en.wikipedia.org/wiki/Facade_pattern

在你的情况下,facade不会是创建一个类并定义你想要使用的每个方法,而是在该方法中调用任何内部实例的任何方法。但我真的没有看到任何好处,而不是打电话 实例和方法是分层次的

答案 1 :(得分:2)

好像你对OOP真的很困惑。

父类没有意识到它的孩子。如果要执行子类,则需要创建其实例。

PHP中也不允许多重继承(以及Java等许多其他流行语言)。

可能值得查看聚合 - 将较小的子类传递给子类或事件父类。另外,您可以使用实现多个接口来强制子类拥有一组必需的方法。

答案 2 :(得分:1)

你正在做的事情真的倒退了。继承用于在没有代码重复的情况下赋予对象共同的共享功能。继承从Parent到Child,Parent可以做的所有事情,Child也可以做,但它可以做更多(它扩展父母的功能)。

class Parent {

    function everyoneCanDoThis() { }

}


class Child extends Parent {

    // I can implicitly use the everyoneCanDoThis() function

    function onlyChildrenCanDoThis() { }

}

由于这是一种自上而下的结构,因此父母不应该依赖任何特定的儿童。 Parent不执行或调用Child的功能。只有调用Child的函数,但这些函数可以从Parent类继承。

您应该在Parent类中放置您希望每个对象都可以执行的操作。仅与特定对象相关的特定功能会进入Child。

多重继承是一种不同的蠕虫病毒,这在PHP中是不可能的,原因很充分。当你获得继承的基础时,回到组合,正如其他地方所建议的那样。 :)


组合只是意味着您获取多个对象并在另一个对象中保存对它们的引用。它与继承无关,因为这些对象中的每一个都可以从Parent类继承,也可以不从Parent类继承,它们仍然是单个对象。

class ComposedObject {

    private $part1 = null;
    private $part2 = null;

    public function __constructor() {
        $this->part1 = new Part1();
        $this->part2 = new Part2();
    }

    public function doTask() {
        return $this->part1->doSomeTask();
    }

    public function doOtherTask() {
        return $this->part2->doSomeOtherTask();
    }

}

ComposedObject本身没有任何功能,继承或其他功能。但它拥有另外两个对象,每个对象都带有一些功能。 “部分”中的功能可以直接公开,因此它们被称为$composedObject->part1->doSomeTask(),它们可以像示例一样被封装,因此它们被称为$composedObject->doTask()并且在内部委托,或者你可以使用一些__call() trickery来自动地将组合对象上调用的函数委托给它的一个“部分”。这与多重继承有同样的问题;如果两个“部分”都包含一个同名的方法,你打电话给哪一个?

答案 3 :(得分:1)

+1给其他人。你真的倒退了。孩子们总是延长他们的父母。

但是甚至有些东西可以像PHP中的多重继承一样:装饰器模式。 我写了一篇关于它的文章on my blog here

答案 4 :(得分:0)

一个类可以实现多个接口,这是一个稍微不同的东西。

当你从父母那里继承时,你会得到它拥有的一切,除非你选择覆盖某些东西,而且你可以通过添加更多更具体的东西来扩展它,但是父母不应该知道关于孩子的任何事情。

实现接口时,接口定义方法但不实现它们。由您来实现它。不同的类可以实现接口方法,只要它们遵循接口所说的内容即可。

继承往往被过度使用并导致糟糕的程序。也许如果你告诉我们你要解决的问题,我们中的一个人可以建议你如何构建你的课程。

答案 5 :(得分:0)

在Php中使用Interface可能会解决问题。