Есть ли способ добиться множественного наследования в php?

Допустим, у меня есть родительский класс

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 ();

Нет, но множественное наследование обычно считается плохой практикой. Вместо этого вы должны использовать композицию, поэтому вы просто используете экземпляры классов, которые вы хотели наследовать внутри своего класса.

И теперь, когда я снова заглядываю в ваш вопрос, это даже не проблема наследования, вы должны использовать композицию. Возможно, если вы предоставите более подробную информацию о том, что вы ожидаете от этого класса, мы должны ответить более точно.

ОБНОВИТЬ:

Вам нужно будет создать один метод для каждого из методов этих классов, который вы хотите использовать, – это называется шаблоном проектирования фасадов. Или, может быть, вы не знаете, что вы можете вызвать методы внутренних объектов, например:

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

Фасад:

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

в вашем случае фасад не будет чем-то другим, кроме создания одного класса и определения каждого метода, который вы хотите использовать, и внутри этого метода вызывается любой метод любого из ваших внутренних экземпляров. Но я действительно не вижу никакой выгоды от этого, вместо того, чтобы вызывать экземпляры и методы иерархически

Похоже, вы действительно смущены ООП.

Родительский класс не осознает своих детей. Если вы хотите выполнить дочерний класс, вам нужно создать его экземпляр.

Множественное наследование также не разрешено в PHP (как и многие другие популярные языки, такие как Java).

Возможно, стоит посмотреть на агрегацию – передать меньшие подкласс в родительский класс для детей или событий. Кроме того, вы можете использовать различные интерфейсы, чтобы заставить подклассы иметь набор необходимых методов.

То, что вы делаете, действительно наоборот. Наследование используется для предоставления общих, общих функций для объектов без дублирования кода. Наследование происходит от родителя к ребенку, все, что может сделать родитель, ребенок может также делать, но он может делать больше (он расширяет функциональность родителя).

 class Parent { function everyoneCanDoThis() { } } class Child extends Parent { // I can implicitly use the everyoneCanDoThis() function function onlyChildrenCanDoThis() { } } 

Поскольку это структура сверху вниз, родитель не должен полагаться на какого-либо конкретного Ребенка. Родитель не выполняет или не вызывает функции Ребенка. Только вы вызываете функции Ребенка, но эти функции могут быть унаследованы от родительского класса.

Вы должны поместить все, что хотите, чтобы каждый объект мог быть в классе родителя. Специфическая функциональность, относящаяся только к конкретному объекту, переходит в Ребенка.

Множественное наследование – это различная возможность червей, которая невозможна в PHP по уважительным причинам. Вернитесь к композиции, как это предлагается в другом месте здесь, когда вы получаете основы наследования. 🙂


Композиция просто означает, что вы берете несколько объектов и держите ссылки на них в другом объекте. Это не имеет ничего общего с наследованием, поскольку каждый из этих объектов может или не может наследоваться от класса 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() для автоматического делегирования функций, вызванных составленным объектом, на одну из своих «частей». Тем не менее, это проблема, связанная с множественным наследованием; если две «части» содержат метод с тем же именем, какой вы называете?

+1 к остальным. У вас действительно есть это в обратном направлении. Дети ВСЕГДА расширяют своих родителей.

Но есть что-то, что может действовать как множественное наследование в PHP: шаблон Decorator. Я написал статью об этом в моем блоге .

Класс может реализовать более одного интерфейса, что несколько отличается.

Когда вы наследуете родителя, вы получаете все, что у него есть, если вы не решите переопределить что-либо, плюс вы можете расширить его, добавив дополнительные более конкретные вещи, но родитель не должен ничего знать о ребенке.

Когда вы реализуете интерфейс, интерфейс определяет методы, но не реализует их. Это зависит от вас, чтобы реализовать его. Различные классы могут реализовать методы интерфейса, но они хотят, пока они следуют тому, что говорит интерфейс.

Наследование, как правило, чрезмерно используется и приводит к плохим программам. Возможно, если вы сообщите нам, какую проблему вы пытаетесь решить, один из нас может предложить, как вы можете структурировать свои классы.

Использование интерфейса в Php может решить вопрос.