- ベストアンサー
protectedなのにアクセスできないのは何故
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"; これが何故エラーになるのか分かりません。 厚かましいとは存じますが、低レベルな質問なんですけど、 オブジェクト指向のプログラムを学ぶ上で基本的な部分なので、 バカにでも分かる回答を宜しくお願い致したいと思う次第です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
protectedを勘違いしているんじゃないかと思う。 protectedは、「そのクラスおよびそのサブクラス内からのみアクセスが許可される」というもの。したがって、サブクラスに用意されたメソッドからは利用することができる。この「サブクラス内からアクセスできる」という部分の意味を勘違いしているのだと思う。 $o->x というのは、サブクラスhoge内で実行してはいない、ということはわかるだろうか。サブクラス以外のところからhogeクラスのインスタンスを作り、そのprotectedメンバにアクセスしようとしている。つまり、これは「サブクラスではないところから、サブクラス内のprotectedメンバ変数を呼び出している」わけで、protectedの許可していないアクセスだから値は取得できない。 もし、これが許可されてしまうと、protectedの意味がなくなる(要するに、どこからでもアクセスできてしまうわけだから)。protectedは、サブクラス内に用意されているメンバ内でのみ限定的に利用できるものであって、「サブクラスのインスタンスを介せばどこからでもアクセスできる」ものではない、ということ。
その他の回答 (1)
- inu2
- ベストアンサー率33% (1229/3720)
外部から直接参照させたい場合は、 public $x; と定義してください。 protectedは継承したクラス内でのみ有効 privateはそのクラス内でのみ有効 ってか、 echo "y = ".$o->y."(直接参照)\n"; ここでもエラーが出るはずですが・・・ 個人的には、クラス内変数を直接参照させること自体が気に入りませんが・・・・
お礼
アドバイスありがとうございます。 ここが分からないんですけど、$oはhogeクラスでfooクラスのサブクラスですよね。 何故直接参照するとエラーなんでしょうか。 10が表示されると思うのですが、間違いないんですよね。 その根本が理解できないんですよね。 プロパティyはprivateなので存在しないnull値で表示されるらしいです。
お礼
logger_manさん、いつも丁寧なアドバイス感謝しています。 >$o->x というのは、サブクラスhoge内で実行してはいない、ということはわかるだろうか。 ここが分からないですね。 >サブクラス以外のところからhogeクラスのインスタンスを作り、そのprotectedメンバにアクセスしようとしている。 これは、hogeクラスのインスタンスは全てfooクラスのサブクラスでは無いと理解していいのでしょうか。 >つまり、これは「サブクラスではないところから、サブクラス内のprotectedメンバ変数を呼び出している」わけで、protectedの許可していないアクセスだから値は取得できない。 なるほど。 1番目が理解できず、2番目は再確認で、3番目は納得という感じですかね。