• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPでの継承について)

PHPでの継承について

このQ&Aのポイント
  • PHPの継承についての質問です。
  • PHPではクラスを継承する場合、スーパークラスのpublicとprotectedなメンバを継承します。
  • 継承とは、スーパークラスで定義したメンバがサブクラスで定義されたことと同義ですが、実行時エラーが発生しています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> とありますが、つまり意味合い的には、いくらクラスを継承しても、 > メソッドやプロパティ自体が物理的に(こういう表現でいいかわかりませんが)サブクラス内に引き継が > れることはなく > オーバ-ライドしない限りは、メソッドはスーパークラス内に存在しているままということでしょうか? んと、引き継がれはします。継承ですから。 引き継がれる=コピーされるのではない、と言えば分かりいいかもしれません。 オーバーライドしていないならば、実体はあくまでAClass内に存在しているわけです。 デバッグ実行をすれば一番分かりやすいと思いますよ。 superClassPublicMethod()を呼び出した瞬間、BClassではなくAClassへ制御が移ります。 > いろいろなサイトではまるで継承することによって > public・protectedなメンバが無条件でサブクラスの物になるように描かれているので・・・・・。 オーバーライドしなければサブクラスの物にはなりません。 正確には、オーバーライドしてもサブクラスのものにはなりません。 なぜなら、サブクラス内でこういうことが出来ますので。 class BClass extends AClass {  public function superClassPublicMethod() {   parent::superClassPublicMethod(); //AClass::superClassPublicMethod()が呼び出される  } } $obj = new BClass(); $obj->subClassPublicMethod(); $obj->superClassPublicMethod(); //BClass::superClassPublicMethod()が呼び出される

__vicky__
質問者

お礼

二度目の回答ありがとうございました。 なんとか、継承理解の糸口がつかめた感じです。

その他の回答 (1)

回答No.1

ええ、なぜならAClass::superClassPublicMethod()を呼んでますからね。 superClassPublicMethod()はAClassのメンバであって、BClassのメンバではありません。 それをしたいならば、それこそ継承しているわけですから、BClass内で superClassPublicMethod()をオーバーライドしてコードします。 継承してオーバーライドしなかったメンバは、自動的にサブクラスに展開されるのではなく、 スーパークラスへ遡って処理されます。 また、例で挙げているだけでご存知だと思いますが、スーパークラスが 暗黙的に、更には前提であるかのように、サブクラスに依存するような コードを書くことは普通しません。 やる場合はインターフェースや抽象メソッドを用意して実装します。

__vicky__
質問者

お礼

ご回答ありがとうございます。 まず、例にあげた、コードですがあくまで継承時のメソッドの動きを検証するためのものです。先に、その旨を描くべきでしたね。 すいません。 一点、 >継承してオーバーライドしなかったメンバは、自動的にサブクラスに展開されるのではなく、 スーパークラスへ遡って処理されます。 とありますが、つまり意味合い的には、いくらクラスを継承しても、 メソッドやプロパティ自体が物理的に(こういう表現でいいかわかりませんが)サブクラス内に引き継がれることはなく オーバ-ライドしない限りは、メソッドはスーパークラス内に存在しているままということでしょうか? いろいろなサイトではまるで継承することによって public・protectedなメンバが無条件でサブクラスの物になるように描かれているので・・・・・。

関連するQ&A