你正在做的事情真的是倒退。继承用于在不重复代码的情况下赋予对象通用的共享功能。继承从父级到子级,父级可以做的所有事情,子级也可以做,但它可能会做更多(它扩展了父级的功能)。
class Parent {
function everyoneCanDoThis() { }
}
class Child extends Parent {
// I can implicitly use the everyoneCanDoThis() function
function onlyChildrenCanDoThis() { }
}
由于这是一个自上而下的结构,因此 Parent 不应依赖任何特定的 Child。Parent 不执行或调用 Child 的函数。只有您调用 Child 的函数,但这些函数可能继承自 Parent 类。
您应该将希望每个对象能够执行的所有操作都放在 Parent 类中。仅与特定对象相关的特定功能进入子级。
多重继承是一种不同的蠕虫,在 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 本身没有任何功能,无论是继承的还是其他的。但它拥有另外两个对象,每个对象都带有一些功能。“部分”中的功能可以直接公开,因此它们被称为 like $composedObject->part1->doSomeTask()
,它们可能像示例中一样被封装,因此它们被称为 like$composedObject->doTask()
并且是内部委托的,或者您可以使用一些__call()
技巧来自动委托调用的函数组合对象到它的“部分”之一。不过,这与多重继承有同样的问题;如果两个“部分”都包含同名的方法,你叫哪一个?