あなたがしていることは本当に後方です。継承は、コードを重複させることなく、オブジェクトに共通の共有機能を付与するために使用されます。継承は親から子に行き、親ができることはすべて、子も同様に行うことができますが、それ以上のことを行う可能性があります(親の機能を拡張します)。
class Parent {
function everyoneCanDoThis() { }
}
class Child extends Parent {
// I can implicitly use the everyoneCanDoThis() function
function onlyChildrenCanDoThis() { }
}
これはトップダウン構造であるため、親は特定の子に依存しないでください。親は子の関数を実行または呼び出しません。子の関数を呼び出すのはあなただけですが、これらの関数は親クラスから継承される場合があります。
すべてのオブジェクトで実行できるようにするすべてのものをParentクラスに配置する必要があります。特定のオブジェクトにのみ関連する特定の機能は、子に組み込まれます。
多重継承は、正当な理由から、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には、継承されているかどうかに関係なく、それ自体には機能がありません。しかし、それはそれぞれがいくつかの機能を持っている他の2つのオブジェクトを保持しています。「パーツ」の機能は直接公開されるため、のように呼び出され$composedObject->part1->doSomeTask()
ます。例のようにカプセル化されるため、のように呼び出され$composedObject->doTask()
て内部的に委任されます。または、トリックを使用して、__call()
呼び出された関数を自動的に委任することもできます。構成されたオブジェクトをその「パーツ」の1つに追加します。ただし、これには多重継承と同じ問題があります。2つの「パーツ」の両方に同じ名前のメソッドが含まれている場合、どちらを呼び出しますか?