PHP初心者というより、
これはプログラム初心者と言うべきでしょうか。
まず、ソースコードを見て下さい。
<?php
//スーパークラスfooの定義
class foo {
//xはprotected
protected $x = 10;
//yはprivate
private $y = 10;
}
//サブクラスhogeの定義
class hoge extends foo {
public function getX(){
return $this->x;
}
public function getY() {
return $this->y;
}
}
$o = new hoge();
echo "x = ".$o->getX()."(メソッド経由)\n";
echo "y = ".$o->getY()."(メソッド経由)\n";
echo "y = ".$o->y."(直接参照)\n";
echo "x= ".$o->x."(直接参照)\n";
var_dump($o);
?>
これだと
echo "x= ".$o->x."(直接参照)\n";
の部分がエラーになるんですよね。
$oはhogeクラスでfooクラスのサブクラスですよね。
なので、
echo "x= ".$o->x."(直接参照)\n";
これが何故エラーになるのか分かりません。
厚かましいとは存じますが、低レベルな質問なんですけど、
オブジェクト指向のプログラムを学ぶ上で基本的な部分なので、
バカにでも分かる回答を宜しくお願い致したいと思う次第です。
No.2ベストアンサー
- 回答日時:
protectedを勘違いしているんじゃないかと思う。
protectedは、「そのクラスおよびそのサブクラス内からのみアクセスが許可される」というもの。したがって、サブクラスに用意されたメソッドからは利用することができる。この「サブクラス内からアクセスできる」という部分の意味を勘違いしているのだと思う。
$o->x というのは、サブクラスhoge内で実行してはいない、ということはわかるだろうか。サブクラス以外のところからhogeクラスのインスタンスを作り、そのprotectedメンバにアクセスしようとしている。つまり、これは「サブクラスではないところから、サブクラス内のprotectedメンバ変数を呼び出している」わけで、protectedの許可していないアクセスだから値は取得できない。
もし、これが許可されてしまうと、protectedの意味がなくなる(要するに、どこからでもアクセスできてしまうわけだから)。protectedは、サブクラス内に用意されているメンバ内でのみ限定的に利用できるものであって、「サブクラスのインスタンスを介せばどこからでもアクセスできる」ものではない、ということ。
logger_manさん、いつも丁寧なアドバイス感謝しています。
>$o->x というのは、サブクラスhoge内で実行してはいない、ということはわかるだろうか。
ここが分からないですね。
>サブクラス以外のところからhogeクラスのインスタンスを作り、そのprotectedメンバにアクセスしようとしている。
これは、hogeクラスのインスタンスは全てfooクラスのサブクラスでは無いと理解していいのでしょうか。
>つまり、これは「サブクラスではないところから、サブクラス内のprotectedメンバ変数を呼び出している」わけで、protectedの許可していないアクセスだから値は取得できない。
なるほど。
1番目が理解できず、2番目は再確認で、3番目は納得という感じですかね。
No.1
- 回答日時:
外部から直接参照させたい場合は、
public $x;
と定義してください。
protectedは継承したクラス内でのみ有効
privateはそのクラス内でのみ有効
ってか、
echo "y = ".$o->y."(直接参照)\n";
ここでもエラーが出るはずですが・・・
個人的には、クラス内変数を直接参照させること自体が気に入りませんが・・・・
アドバイスありがとうございます。
ここが分からないんですけど、$oはhogeクラスでfooクラスのサブクラスですよね。
何故直接参照するとエラーなんでしょうか。
10が表示されると思うのですが、間違いないんですよね。
その根本が理解できないんですよね。
プロパティyはprivateなので存在しないnull値で表示されるらしいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) zshの例外処理 1 2022/06/02 16:36
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- C言語・C++・C# Makefileのechoの展開について 2 2022/07/26 07:35
- PHP アップロードファイルの数に応じてCSSを動的に変更したいのですが、方法がわかりません 3 2023/07/23 21:59
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- PHP 掲示板を作成しておりアップロードファイルとメッセージを並べたいので、アドバイスお願い致します 2 2023/07/17 21:01
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
「平成」を感じるもの
「昭和レトロ」に続いて「平成レトロ」なる言葉が流行しています。 皆さんはどのようなモノ・コトに「平成」を感じますか?
-
忘れられない激○○料理
これまでに食べたもののなかで、もっとも「激○○」だった料理を教えて下さい。 激辛、でも激甘でも。 激ウマ、でも激マズでも。
-
プリン+醤油=ウニみたいな組み合わせメニューを教えて!
プリンと醤油を一緒に食べると「ウニ」の味がする! というような意外な組み合わせから、新しい味になる食べ物って色々ありますよね。 あなたがこれまでに試した「組み合わせメニュー」を教えてください。
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
C++ protectedにアクセス不可
C言語・C++・C#
-
派生クラスから基本クラスprotectedメンバへのアクセスについて
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPの名前空間インポートについて
-
AUTO_INCREMENTの動作について
-
エラーの理由が分りません。Pri...
-
python の import エラー Modul...
-
VBA コレクションに2次元配列...
-
変数によるクラスの呼び出しが...
-
VB.NETSystem.Xml 要素数を得る...
-
Type.GetMethodで困っています
-
VB6のコンボボックスのテキスト...
-
Dosブロンプトでtabを出力したい
-
wordの差し込み印刷で文字...
-
shシェルスクリプト 空白行の...
-
開始と終了を指定して、その間...
-
EXCEL、マクロ-改ページ行番号...
-
バッチファイルでpingの結果を...
-
VB or VBScriptでPCの製造番号...
-
vb2005でhtmlからテキストのみ...
-
ThreadのHandleの取得方法を教...
-
「取得先」という表現について
-
ImmGetConversionListについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA コレクションに2次元配列...
-
エラーの理由が分りません。Pri...
-
VB.NETからVBAマクロ(引数)を呼...
-
classの再定義エラーについて
-
可変変数にアロー演算子を使いたい
-
ASPのResponse.WriteをPHPでは...
-
PHPの名前空間インポートについて
-
protectedなのにアクセスできな...
-
条件式 ! char[0] とは
-
PHPの変数値をリンクさせたい
-
PHP、ヒアドキュメント内でのIF...
-
fwriteで改行出来ない
-
vb作成したらでbeep音が鳴りま...
-
Smarty変数の値をJavascript変...
-
UNIX CP "で上書きしません"
-
変数に格納できる桁数に制限は...
-
正規表現 ファイル名の取得
-
PHPで連番を繰り返す
-
Type.GetMethodで困っています
-
PHPでの画像の形式の変換
おすすめ情報