2011-07-03 9 views
7

可能性の重複:
Can I extend a class using more than 1 class in PHP?1つのクラスで2つのクラスを拡張できますか?

私はしかし、私は今、私はまた、親の子になりたい別のクラスを追加してい、いくつかの子クラスを持つクラスを持っている、しかし、私はまた、他の子クラスの1つから多くの関数を利用したいと思います。

私は、他の子クラスから親にそれぞれの関数を移動することを考えましたが、これを使用する2つの子クラスのみであるため、これが本当に必要とは思わなかったメインの親クラスと既存の子クラスのいずれかから拡張できます。

答えて

9

親クラスと子の関数の両方を継承するように子クラスを拡張することができます。これはあなたがしようとしていると思います。

class Parent 
{ 
    protected function _doStuff(); 
} 

class Child extends Parent 
{ 
    protected function _doChildStuff(); 
} 

class Your_Class extends Child 
{ 
    // Access to all of Parent and all of Child's members 
} 

// Your_Class has access to both _doStuff() and _doChildStuff() by inheritance 
+0

を(すなわち 'A、B'か何かを拡張する) – alxbl

+0

何が私はやっていると思っていたが、それは主な親からのものを継承するとは思わなかった。この場合、どのクラスが親ですか?非親から関数/メソッドにどのようにアクセスしますか? – Brett

+0

'Your_Class'からいつものように' $ this-> method() 'を使ってそれらを呼び出すことができます。' protected'と 'public'メンバはすべて継承されます。 'Child'は' Your_Class'の親ですが、多型によって 'Parent'のタイプヒントは' Your_Class'オブジェクトも受け入れます。 *コード例に少し詳しく説明して、* – alxbl

8

phpは単一継承言語ではありません。 php 5.4で今後登場する機能を調べることができれば、それは特色です。

2

はい/いいえ答えとして、いいえと言えます。 PHPでは複数のクラスから拡張することはできません。代わりにinterfaceを使用することができます。

0

これは後ろ向きに考えても構いませんが、状況によって異なります。あなたのクラスを分けておきたいのであれば、あなたが私たちにもっと情報を与えない限り、あなたのオブジェクトと継承をどのように構造化するかについて、誰もあなたに良い答えを与えることはできません。また、クラス構造を正しいものにするのも心配することは、小規模なプロジェクトの負担であり、メソッドをオーバーラップさせて実行し、後でクラスについて学ぶこともできます。

8

@morphlesと同じように、この機能はphp 5.4の特徴(他の言語のmixinのようなもの)として利用できます。それが本当に必要なの場合は、あなたは、このような回避策を使用することができます:他の人が言ってきたように、クラスは一度に2つのクラスから継承することはできませんが

// your class #1 
class A { 
    function smthA() { echo 'A'; } 
} 

// your class #2 
class B { 
    function smthB() { echo 'B'; } 
} 

// composer class 
class ComposeAB { 
    // list of implemented classes 
    private $classes = array('A', 'B'); 
    // storage for objects of classes 
    private $objects = array(); 

    // creating all objects 
    function __construct() { 
     foreach($this->classes as $className) 
      $this->objects[] = new $className; 
    } 

    // looking for class method in all the objects 
    function __call($method, $args) { 
     foreach($this->objects as $object) { 
      $callback = array($object, $method); 
      if(is_callable($callback)) 
       return call_user_func_array($callback, $args); 
     } 
    } 
} 

$ab = new ComposeAB; 
$ab->smthA(); 
$ab->smthB(); 
+0

の回避策の例をお寄せいただきありがとうございます。 – Brett

+0

ご参考までに)あなたのニーズに合わせて変更できない場合は、私にお書き添えください。 – RReverser

+0

ComposeABがAとBの関数を指定するインタフェースを実装する必要がある場合、これは機能しますか?インターフェイスがsmthAとsmthBを持っていて、ComposeABがそのようなインターフェイスを実装したとしたら、__call関数はインターフェイスの要件を満たしていますか? – CMCDragonkai

関連する問題