- ベストアンサー
クラス継承 メンバ引継ぎとprivateについて
- クラス継承時にはメンバ引継ぎが行われ、privateメンバも継承される。
- privateでオーバーライドされた場合、サブクラスからはアクセスできないが、親クラスのメソッドを利用してアクセス可能。
- Chクラスのインスタンスに対してgetLevelメソッドを呼び出した場合、親クラスのgetLevelメソッドが実行される。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
その通りだと思います。チマチマすれば >Paクラスプロパティがprivateだったため、 は >getLevel()があるPaクラスでは、プロパティがprivateだったため、 かな。 「$this」が何を示すかは柔軟に変化してしまうので、 ・そのクラス内で宣言したプロパティを指したいのなら、継承先でも触れないprivate ・継承先で上書きされる可能性がある場合(許す場合)は、protected (または禁忌だけどpublic)で、という感じでしょうか。 (正式な解説ページ探したけど見つけられない…。以下がご参考になれば) http://php.e1blue.net/term/entry.php?entryID=67&categoryID=12 http://www.shigeweb.jp/php/project_p/?page=class§ion=first
その他の回答 (2)
- JaneDue
- ベストアンサー率75% (263/350)
「2つ」は語弊があるので「2種類」に訂正。pritate はそのクラスのスコープ専用なので、継承する各クラスに1つづつ、protected||public はオブジェクトに1つ。
補足
補足説明ありがとうございました。 1点確認させてください。 そうすると、echo $ch->getLevel();で返ってくる10というプロパティの所属先は、 Paクラスという認識であってるでしょうか? つまり、この例の処理内容は、 chインスタンスオブジェクトを生成したのに、 Paクラスプロパティがprivateだったため、 chインスタンスオブジェクトのプロパティを取得出来ずに、 Paクラスに所属しているプロパティを取得した、という理解で合ってるでしょうか。
- JaneDue
- ベストアンサー率75% (263/350)
同名のプロパティがある場合、そのクラスのprivateがまず優先されます。(private という位なのでその値が保証されないと困ります。でないと結局継承先で上書きされてしまうことになる。) >このとき、$ch->getLevel();は、~ 流れで見ると 1.$ch = new Ch(); では、$ch->level は Chで宣言した 5 (ただしPaクラス内に限り10) 2.$ch->getLevel(); でまず子クラスで関数を探す => 3.存在しないので、親クラスのgetLevel()が実行される => 4.親クラスでは $level は privateとprotected の2つがある => 5.privateが優先されて、10 が返る となるかと。 もしChの方にgetLevel()があれば、当然そこで宣言した 5 が返るでしょう。 また親クラスでの定義がなければ、優先すべきprivateは無いので 5が返ります。 >Chクラスの「$level」は、どういう状態~ privateと protected 2つのlevelがある状態。(var_dumpしてみて) >新定義扱いされてるってことでしょうか? と言ってもよいかと。後で宣言する方は最初の宣言よりゆるい場合のみ定義でき、またprotectedはpublicで上書きされるので、『事実上 同名のプロパティは privateと protectedまたはpublicの 「2つ」まで定義できる』ことになります。
お礼
回答ありがとうございました。 >2.$ch->getLevel(); でまず子クラスで関数を探す => >3.存在しないので、親クラスのgetLevel()が実行される => >5.privateが優先されて、10 が返る 詳しく説明いただいたので、大変分かりやすかったです。
お礼
回答ありがとうございました。 大変勉強になりましたー!