「クラス継承時のメンバ引継ぎの意味」と、
「privateでオーバーライドさせた際の挙動」ついて教えてください。
class Pa{
private $level="10";
public function getLevel(){
return $this->level;
}
}
class Ch extends Pa{
protected $level="5";
}
$ch = new Ch();
echo $ch->getLevel();
このとき、$ch->getLevel();は、
Paクラスのメソッドをchオブジェクトで見に行ってるのでしょうか?
それとも、Chクラスに引き継がれたメソッドを見に行っているのでしょうか?
また、このときの「$this」「$this->level」は、それぞれ何を意味しているのでしょうか?
また、このときの、Chクラスの「$level」は、どういう状態(扱い)になっているのでしょうか?
エラーにならないのですが、再定義扱いされないのでしょうか?
新定義扱いされてるってことでしょうか?
「privateメンバを継承した際」、どういう動きをするのか(ルールになっているのか)教えてください。
No.3ベストアンサー
- 回答日時:
その通りだと思います。
チマチマすれば>Paクラスプロパティがprivateだったため、
は
>getLevel()があるPaクラスでは、プロパティがprivateだったため、
かな。
「$this」が何を示すかは柔軟に変化してしまうので、
・そのクラス内で宣言したプロパティを指したいのなら、継承先でも触れないprivate
・継承先で上書きされる可能性がある場合(許す場合)は、protected (または禁忌だけどpublic)で、という感じでしょうか。
(正式な解説ページ探したけど見つけられない…。以下がご参考になれば)
http://php.e1blue.net/term/entry.php?entryID=67& …
http://www.shigeweb.jp/php/project_p/?page=class …
No.2
- 回答日時:
「2つ」は語弊があるので「2種類」に訂正。
pritate はそのクラスのスコープ専用なので、継承する各クラスに1つづつ、protected||public はオブジェクトに1つ。この回答への補足
補足説明ありがとうございました。
1点確認させてください。
そうすると、echo $ch->getLevel();で返ってくる10というプロパティの所属先は、
Paクラスという認識であってるでしょうか?
つまり、この例の処理内容は、
chインスタンスオブジェクトを生成したのに、
Paクラスプロパティがprivateだったため、
chインスタンスオブジェクトのプロパティを取得出来ずに、
Paクラスに所属しているプロパティを取得した、という理解で合ってるでしょうか。
No.1
- 回答日時:
同名のプロパティがある場合、そのクラスの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 が返る
詳しく説明いただいたので、大変分かりやすかったです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- C言語・C++・C# C# 継承の問題で programに示された拡張をすべて含んだ上で,クラス Mammal に,そのオ 1 2022/07/22 09:48
- C言語・C++・C# 現在プログラムを作っているのですが、実行したときに写真のように結果が表示されるのですが、これを CH 2 2023/01/18 16:22
- 大学受験 高校化学の有機分野です。 この構造式で表される立体異性体は3種類ですが この場合ってc=cに結合して 3 2022/09/28 11:14
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- 化学 応えを教えてください 1 2023/08/06 17:39
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
phpのクラスメソッドの定義が長...
-
【PHP】privateな静的メソッド...
-
メモリ解放のタイミング
-
class定義のphpをファイル分割...
-
こちらはただの直列処理ですか?
-
フォントの色を変えるには?
-
onedrive にexcelファイルをア...
-
form actionで二つ送信先を指定...
-
シェルスクリプトからphpファイ...
-
FTPコマンドでディレクトリごと...
-
PHPのif文でその処理を途中で抜...
-
存在しないメールアドレスかど...
-
.htaccessにphp_valueが使用できな
-
PHP8を使うと、大量のWarningが...
-
PHPでfatal errorが出ても無視...
-
アップロード画像数でCSSを分け...
-
Apacheでhttp://localhost/が表...
-
別ファイルの変数を呼び出した...
-
FORMで送信ボタンと戻るボタン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
phpのクラスメソッドの定義が長...
-
ラッパークラスって何ですか?
-
'_'(アンダースコア)の使い方...
-
class定義のphpをファイル分割...
-
配列とオブジェクトの違い
-
PHP4、PHP5 1ファイル複数クラ...
-
関数定義の関数名の前にある&(...
-
php、可変プロパティ名について
-
クラス設計の良い参考書を教え...
-
phpのクラスにて別ファイルの変...
-
class.upload.phpの戻り値(返...
-
【PHP】クラス と 関数 の違い
-
php インスタンスとオブジェク...
-
Re: Cookieを使ってオブジェク...
-
PHPでサブクラスからスーパクラ...
-
クラス
-
onedrive にexcelファイルをア...
-
フォントの色を変えるには?
-
index.phpに入るには、どうすれ...
おすすめ情報