2012-06-07 11 views
5

PHPで親コンストラクタを明示的に呼び出す必要があるのはなぜですか?派生クラスの親コンストラクタを呼び出すことを忘れたとしたらどうなりますか?親コンストラクタをPHPで明示的にコールしないとどうなりますか?

派生クラスは、親クラスのメンバープロパティまたはメソッドにアクセスできないと思っていましたが、親コンストラクタを呼び出さないようにしても、子クラスは引き続き親のpublic/protectedメンバー。

親コンストラクタを明示的に呼び出す必要がありますか?そうすることを忘れた場合の影響は何ですか?

ありがとうございます。どんな種類の助けも高く評価されます:)

+2

マニュアルを確認するhttp://php.net/manual/en/language.oop5.php – sephoy08

答えて

4

これはコードによって異なります。親コンストラクタを呼び出さないと、何も起こりませんが、親コンストラクタが親クラスのために何かを初期化している場合は、すべて省略されます。考えてみましょう、とこれで遊ぶ:

<?php 

class X { 
    private $_a; 

    public function __construct($a) { 
     echo 'X::construct '; 
     $this->_a = $a; 
    } 

    public function getA() { 
     return $this->_a; 
    } 
} 

class Y extends X { 
    private $_b; 

    public function __construct($a,$b) { 
     echo 'Y::construct '; 
     parent::__construct($a); 
     $this->_b = $b; 
    } 

    public function getAB() { 
     return $this->_b + $this->getA(); 
    } 
} 

$n = new Y(3,2); 
echo $n->getAB(); 

それはあなたがこれを実行する場合、それは(他ダンプの中で)5を出力していることを確認するのは簡単です。しかし、あなたがclass Y親コールparent::__construct($a);とコメントすると、あなたは2になります。これがこの場合の結果です。

1

結果は本当に親のコンストラクタで何が起こるかによって決まります。親コンストラクターが呼び出されていない場合でも、publicおよびprotectedメンバーのプロパティとメソッドはすべて使用できます。しかし、継承されたクラスメンバーの値は、親コンストラクターで変更/初期化されている可能性があります。

親コンストラクタに何も起こらなくても(それは将来変化するかもしれませんが)、常に親コンストラクタへの呼び出しを追加するのが良いでしょう。この呼び出しを省略する唯一の理由は、コンストラクターで実行されるアクションをオーバーライドする必要がある場合です。これは、あなたが持っているよりも柔軟性を高める機能です。 Javaでは、親コンストラクタの呼び出しは必須です。

3

子クラスがコンストラクタを定義する場合、親コンストラクタは暗黙的に呼び出されないためです。子クラスが、親が初期化され、何らかの作業を行ったことを前提とする場合、親コンストラクターが確実に入力される必要があります。

たとえば、を入力しないクラスを拡張する場合は、親コンストラクタを入力するを入力します。この振る舞いによって、設計の柔軟性が向上します。ほとんどの場合、、おそらくは親コンストラクタを呼び出したいと思っています。

これはすべてに依存し、なぜあなたは親を拡張しましたか。親の初期化を必要とするメソッドが必要ですか?はいの場合は、コンストラクタを呼び出します。あなたはそれを拡張した後に必要な特定の依存関係を注入することができますか、定数のような単純なものが必要ですか?それからあなたはおそらく必要はありません。

関連する問題