- ベストアンサー
PHPでの継承について
- PHPの継承についての質問です。
- PHPではクラスを継承する場合、スーパークラスのpublicとprotectedなメンバを継承します。
- 継承とは、スーパークラスで定義したメンバがサブクラスで定義されたことと同義ですが、実行時エラーが発生しています。
- みんなの回答 (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()が呼び出される
その他の回答 (1)
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
ええ、なぜならAClass::superClassPublicMethod()を呼んでますからね。 superClassPublicMethod()はAClassのメンバであって、BClassのメンバではありません。 それをしたいならば、それこそ継承しているわけですから、BClass内で superClassPublicMethod()をオーバーライドしてコードします。 継承してオーバーライドしなかったメンバは、自動的にサブクラスに展開されるのではなく、 スーパークラスへ遡って処理されます。 また、例で挙げているだけでご存知だと思いますが、スーパークラスが 暗黙的に、更には前提であるかのように、サブクラスに依存するような コードを書くことは普通しません。 やる場合はインターフェースや抽象メソッドを用意して実装します。
お礼
ご回答ありがとうございます。 まず、例にあげた、コードですがあくまで継承時のメソッドの動きを検証するためのものです。先に、その旨を描くべきでしたね。 すいません。 一点、 >継承してオーバーライドしなかったメンバは、自動的にサブクラスに展開されるのではなく、 スーパークラスへ遡って処理されます。 とありますが、つまり意味合い的には、いくらクラスを継承しても、 メソッドやプロパティ自体が物理的に(こういう表現でいいかわかりませんが)サブクラス内に引き継がれることはなく オーバ-ライドしない限りは、メソッドはスーパークラス内に存在しているままということでしょうか? いろいろなサイトではまるで継承することによって public・protectedなメンバが無条件でサブクラスの物になるように描かれているので・・・・・。
お礼
二度目の回答ありがとうございました。 なんとか、継承理解の糸口がつかめた感じです。