7

なぜ PHP で親コンストラクターを明示的に呼び出さなければならないのか疑問に思っていました。たとえば、派生クラスで親コンストラクターを呼び出すのを忘れたらどうなるでしょうか?

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

では、その親コン​​ストラクターを明示的に呼び出す必要があるのでしょうか? そうするのを忘れると,どんな結果になるでしょうか。

前もって感謝します。あらゆる種類のヘルプをいただければ幸いです:)

4

3 に答える 3

6

それはあなたのコードに依存します。親コンストラクターを呼び出さないと何も起こりませんが、親コンストラクターが親クラスの初期化を行う場合、それはすべて省略されます。考えて、これで遊んでください:

<?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 callをコメントするとparent::__construct($a);、2 になります。これがこの場合の結果です。

于 2012-06-07T05:43:32.447 に答える
3

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

たとえば、親コンストラクターを入力したくないクラスを拡張する場合があります。この動作により、設計の柔軟性が向上します。ほとんどの場合、おそらく親コンストラクターを呼び出す必要があります。

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

于 2012-06-07T05:43:12.657 に答える
1

結果は、親コンストラクターで何が起こるかに大きく依存します。親コンストラクターが呼び出されていない場合でも、パブリックおよびプロテクト メンバーのすべてのプロパティとメソッドを使用できます。これは正しいことです。ただし、継承されたクラス メンバーの値は、親コンストラクターで変更/初期化される可能性があります。それを行うかどうかを決定する必要があります。

親コンストラクターで何も起こらない場合でも、常に親コンストラクターへの呼び出しを追加することは、通常は適切な決定です (これは将来変更される可能性があります)。この呼び出しを省略する唯一の理由は、コンストラクターで実行されるアクションをオーバーライドする必要がある場合です。これは、親コンストラクターの呼び出しが必須である Java などよりも柔軟性を高める機能です。

于 2012-06-07T05:41:49.837 に答える