• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:protectedなのにアクセスできないのは何故 その2)

protectedなのにアクセスできないのは何故 その2

このQ&Aのポイント
  • プログラム初心者のため、protectedな変数$xに直接アクセスできないエラーが発生しています。
  • $oはhogeクラスでfooクラスのサブクラスですが、protectedな変数はサブクラスからは直接アクセスできません。
  • これはオブジェクト指向プログラミングの概念であり、クラスの階層構造によりアクセス可能な範囲が決まっています。

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

  • ベストアンサー
  • atse
  • ベストアンサー率83% (36/43)
回答No.2

> $oはインスタンスであってクラスではない。 そうです。 classはオブジェクトを生成するための雛形のようなものです。 > $o->x は$oの中のプロパティxにアクセスしている訳ではないのでしょうか。 > そうすると、$oイコールhogeクラス内のプロパティxにアクセスしている、という事にはならないのですか。 $o->x は$oの中のプロパティxにアクセスしています。 ただ、前途の通りhogeはただの雛形です。 $oはそれを元に新たに生成されたものです。 $a = new hoge();$b = new hoge();・・・ とやっていけば、各々のxを持ったオブジェクト(hogeのインスタンス)が生成されます。 で、繰り返し言いますが、$o->xと参照を記述している箇所が外部です。 外部からの参照は不可、それがprotectedです。 ここで言う内部とは、雛形であるclass定義部分の記述です。 getX()を見ればわかりますが、class定義部分=hoge{}内でxを参照しています。 もう一度言います、内部参照とはclass定義部分に記述され、完結する参照を指します。

persona
質問者

お礼

親切丁寧な説明感謝しています。 なるほどです。 今一外部の部分が分からなくなりそうですが、クラスの記述部分が内部でそれ以外は外部ですかね。 やっと底なし沼から抜け出せそうです。

persona
質問者

補足

1つ今締め切ろうとして気付いた事がありまして。 2つの回答共にatseさんだったのですね。 大変失礼を致しました。 最終的に、お礼の欄に書いたような解釈しかできませんでした。 今もってそれが正しいのか間違っているのかは分かりませんが、ここまで辿り着けたのは、全てatseさんのおかげです。 どうもありがとうございました。

その他の回答 (1)

  • atse
  • ベストアンサー率83% (36/43)
回答No.1

まず、$o->yの参照でエラーにならないのは、 fooのyはprivateなので、hogeのyとして継承されない、 つまり$oのyが未定義だからです。 ini_set等でエラー表示の強化、またはis_null等で確認できるでしょう。 また、var_dump($o);で表示されるyは、 fooから生成されたインスタンスの内部的な親のyであって、 hogeとしての$o自体のyではありません。 class hoge内で$yを定義した後var_dump($o);とすると両方表示され、 異なるものだとわかるかと思います。 このこと(fooからの情報も受け継いでいる)から、 $oは、fooのサブクラスhogeから作られたインスタンスということがわかります。 そして、$oはhogeそのものではなく、 あくまでもhogeというデータを基に作られたインスタンス(クローンのようなもの)なので、 $oの値を変更しても、class hoge には影響しません。 以上を踏まえ、質問のなぜエラーになるかというのは、 今回 x を呼び出しをしたところが、 protectedの範囲内(class or その派生class内)ではなく、 echo "x= ".$o->x."(直接参照)\n"; の記述箇所だからです。 つまり"外部から"直接参照した結果のエラーです。

persona
質問者

お礼

親切丁寧な説明に感謝します。 まず、私の考え方が間違っていた事に気付きました。 1つだけ確認をしてもいいですか。 バカな確認と思われるかもしれませんが、 $oはインスタンスであってクラスではない。 これは当たっているでしょうか。 インスタンスの項目を調べても中々見つかりません。 どうぞ宜しくお願い致します。

persona
質問者

補足

$oの中のプロパティxにアクセスしているんですよね。 $oはfooのサブクラスhogeのインスタンス。 $o->x は$oの中のプロパティxにアクセスしている訳ではないのでしょうか。 そうすると、$oイコールhogeクラス内のプロパティxにアクセスしている、という事にはならないのですか。

関連するQ&A