2016-05-11 5 views
1

AbstractClassがあるとしますPHP:コンストラクタの伝播やコンクリートの子供にコンストラクタを移動

abstract class AbstractClass { 

    protected $fooClass; 

    public function __construct($fooClass) 
    { 
     $this->fooClass = $fooClass; 
    } 

    public function bar() 
    { 
     $this->fooClass->baz(); 
    } 
} 

AbstractClassは子供のカップル(第一世代)を有し、これらの子供たちは、自分の子供(第2世代)を持っています。すべての子供は具体的なクラスです。

第2世代の子​​供にAbstractClassbar()メソッドを使用します。私の最初の推測は、parent::__construct($fooClass);で2世代から1世代にコンストラクタを伝播することです。それが良いかどうかわからない。

AbstractClassのコンストラクタを第2世代の子​​に移動すると、その子からbar()メソッドを呼び出すことはできますか?

これを行うには良い方法がありますか?子クラスがコンストラクタを定義する場合

答えて

1

http://php.net/manual/en/language.oop5.decon.php親のコンストラクタが暗黙的に呼び出されていません。親コンストラクタを実行するには、子コンストラクタ内でparent :: __ construct()を呼び出す必要があります。子がコンストラクタを定義していない場合は、通常のクラスメソッドのように親クラスから継承することができます(プライベートとして宣言されていない場合)。

これは、2つのオプションがあります意味:

  1. 子供のための任意のコンストラクタを定義します(ほとんどの場合、おそらく実行可能ではない)とだけ抽象クラスのコンストラクタは、すべての子供たちのために存在することを前提としないでくださいが。すべての子のコンストラクタで
  2. コールparent::__constructbar()は、それがクラスメソッドと同様に呼び出すことができかつ抽象クラスメソッドbar()を参照する任意の子クラスでオーバーライドされていない方法限り

を(推奨)。

+0

あなたの引用の_Parentコンストラクタは暗黙的に呼び出されません**もし**子クラスがコンストラクタを定義していれば私は第1世代の子でコンストラクタを省略することができます(最上位の親と子のコンストラクタ引数第一世代のものは同じです)。 –

関連する問題