PHPでは、オブジェクトBがオブジェクトAを拡張するときに、オブジェクトのBインスタンス化がオブジェクトAで自動的にトリガーされないのはなぜ__construct()
ですか?
オブジェクトBの構成関数にオブジェクトAの構成関数全体を2つ複製しているのは奇妙に思えます。私は間違いを犯していますか?または継承を悪用しますか?
PHPでは、オブジェクトBがオブジェクトAを拡張するときに、オブジェクトのBインスタンス化がオブジェクトAで自動的にトリガーされないのはなぜ__construct()
ですか?
オブジェクトBの構成関数にオブジェクトAの構成関数全体を2つ複製しているのは奇妙に思えます。私は間違いを犯していますか?または継承を悪用しますか?
新しい__constructメソッドを実装しない場合、クラスAのコンストラクターが自動的に呼び出されます。Bで新しいコンストラクターを作成し、クラスAから古いコンストラクターを呼び出す場合は、次のように呼び出す必要があります。parent::__construct(yourparams,...)
コードを複製する必要はありません。
Bのコンストラクターが定義されていない場合は、Aのコンストラクターを使用します。
そうである場合は、次のように、構成呼び出しをAにチェーンバックする必要があります。
class A {
function __construct(...) {
//do something
}
}
class B extends A {
function __construct(...) {
parent::__construct(...);
//do something more
}
}
サブクラスに明示的なコンストラクターがない場合、スーパークラスコンストラクターは暗黙的に実行されます。
サブクラスに明示的なコンストラクターがある場合は、スーパークラスのコンストラクターをオーバーライドするため、必要に応じてサブクラスのインスタンス化の動作を完全に変更できます。
サブクラスにインスタンス化動作を追加したいが、それでもスーパークラスの動作を維持したい場合は、次のようにする必要があります。
public function __construct ($arg) {
parent::__construct ($arg);
// Additional construction logic goes here
}
親コンストラクターは暗黙的に呼び出されないため、子クラスのコンストラクターからparent :: __construct()を呼び出す必要があります。
これを見てください