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