Есть ли способ добиться множественного наследования в php? - PullRequest
4 голосов
/ 12 мая 2010

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

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 ]

2 голосов
/ 12 мая 2010

Похоже, вы действительно запутались в ООП.

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

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

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

2 голосов
/ 12 мая 2010

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

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

UPDATE:

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

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

Фасадный узор:

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

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

1 голос
/ 12 мая 2010

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

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

1 голос
/ 12 мая 2010

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

class Parent {

    function everyoneCanDoThis() { }

}


class Child extends Parent {

    // I can implicitly use the everyoneCanDoThis() function

    function onlyChildrenCanDoThis() { }

}

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

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

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


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

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

0 голосов
/ 12 мая 2010

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

0 голосов
/ 12 мая 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...