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