PHPで多重継承を実現する方法はありますか?
-
26-09-2019 - |
質問
親クラスがあるとします。
class parent { }
.....
この親には 3 つのサブクラスがあります
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();
解決
いいえ、しかし、多重継承は一般的に悪い習慣と考えられています。あなたは自分のクラス内で継承するためにあなたが望んでいたクラスのインスタンスを使用するようにするには、代わりに構図を優先する必要があります。
私は再びあなたの質問に見たときに、そして今、それも相続の問題ではありません、あなたは、組成物を使用する必要があります。あなたは、そのクラスが何を期待するものより詳細な情報を提供する場合はたぶん、私たちは、より正確に答える必要があります。
UPDATE:
あなたが使用したいと思うこれらのクラスメソッドごとに1つのメソッドを作成する必要があります - それは、ファサードデザインパターンと呼ばれています。それともあなたは、このような内部のオブジェクトのメソッドを呼び出すことができることに気づいていない。
$parent->subObject->subSubObject->wantedMethod();
Facadeパターンます:
http://en.wikipedia.org/wiki/Facade_patternする
あなたのケースでファサードは、1つのクラスを作成するよりも何か他のものではないでしょうし、あなたの内側のインスタンスのいずれかの任意のメソッドを呼び出す使用すると、そのメソッド内であなたが望むすべての単一のメソッドを定義します。しかし、私は本当にすべての利益が呼び出すのではなく、このことから来て表示されません 階層的にインスタンスとメソッド
他のヒント
思えます。
親クラスは、その子のない意識を持っていません。あなたは子クラスを実行する場合は、そのインスタンスを作成する必要があります。
多重継承もPHPで許可される(だけでなく、Javaのような他の多くの一般的な言語)されていません。
これは価値が集約している可能性があります - 子供やイベントの親クラスに小さなサブクラスを渡します。また、あなたが必要なメソッドのセットを持っている力のサブクラスに複数のインタフェースを実装し使用することができます。
やっていることは本当に逆行している。継承は、コードを重複させることなく、共通の共有機能をオブジェクトに付与するために使用されます。継承は親から子に伝わり、親ができることはすべて、子も同様に行うことができますが、それ以上のこともできる可能性があります ( 伸びる 親の機能)。
class Parent {
function everyoneCanDoThis() { }
}
class Child extends Parent {
// I can implicitly use the everyoneCanDoThis() function
function onlyChildrenCanDoThis() { }
}
これはトップダウン構造であるため、親は特定の子に依存すべきではありません。親は子の関数を実行したり呼び出したりしません。のみ あなた 子の関数を呼び出しますが、これらの関数は親クラスから継承される場合があります。
すべてのオブジェクトに実行させたいすべてのことを親クラスに含める必要があります。特定のオブジェクトにのみ関連する特定の機能は、子に組み込まれます。
多重継承は、正当な理由により、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();
}
}
CompusedObject 自体には、継承されたかどうかにかかわらず、機能はありません。ただし、それぞれが何らかの機能を実行する他の 2 つのオブジェクトを保持します。「パーツ」の機能は直接公開される可能性があるため、次のように呼ばれます。 $composedObject->part1->doSomeTask()
, 、例のようにカプセル化される場合があるため、次のように呼ばれます。 $composedObject->doTask()
内部的に委任されているか、いくつかを使用することもできます __call()
策略 構成されたオブジェクトで呼び出される関数をその「部分」の 1 つに自動的に委任します。ただし、これには多重継承と同じ問題があります。2 つの「部分」の両方に同じ名前のメソッドが含まれている場合、どちらを呼び出しますか?
他の人に+1。あなたは本当に後方にそれを持っています。子供ALWAYSは両親を拡張します。
しかし、PHPでの多重継承のような一種の行動ができても何かがある:Decoratorパターンは。 私は私の上それについての記事を書きましたをここにブログます。
クラスは若干異なるものである複数のインターフェイスを実装することができます。
あなたが親から継承する場合は、あなたが何かを上書きすることを選択し、プラス追加のより具体的なものを追加することによって、それを拡張することができますが、親が子供について何も知らないはずがない限り、それが持っているすべてを取得。
は、インターフェイスを実装すると、インターフェースはメソッドを定義しますが、それはそれらを実装していません。それは、それを実装するのはあなた次第です。彼らがいる限り、彼らはインターフェイスが言うことに従うよう望んしかし、異なるクラスは、インターフェイスメソッドを実装することができます。
継承が悪いのプログラムに過剰に使用してリードされる傾向にあります。あなたが解決しようとしている何の問題を語ってくれたならば、おそらく、私たちの一つは、あなたのクラスを構築する方法を提案することができます。
PHPのインタフェースを使用したが、多分疑問を解決します。