2009-08-18 9 views
3

クラスの異なるインスタンスは、互いに他のプライベートメンバー変数を知ることができるようです。PHPのスコープとクラスのインスタンスのやりとり

私は自分の問題を紹介しようとするいくつかのコードを提供しており、私はそれを説明しようとします。

プライベートメンバー変数$hiddenを持つクラスがあります。 modifyPrivateMember$hiddenの値を3に設定します。 accessPrivateMemberObjectをパラメータとし、プライベート$hiddenのメンバーにアクセスして値を返します。

コード例:上記のコードの

<?php 
// example.php 

class Object { 
    private $hidden; 

    public function modifyPrivateMember() { 
     $this->hidden = 3; 
    } 

    public function accessPrivateMember(Object $otherObject) { 
     return $otherObject->hidden; 
    } 
} 

$firstObject = new Object; 
$firstObject->modifyPrivateMember(); 


$otherObject = new Object; 
echo $otherObject->accessPrivateMember($firstObject); 

出力:

$ php example.php 
3 

オブジェクトのプライベートメンバーは、同じクラスの他のインスタンスにアクセス可能な、なぜ誰も説明できますか?この表向きの範囲違反の正当な理由はありますか?

+0

これまでの回答から、コードが例示した内容が分かりました。私は本当に*なぜ*物事がこのようになっているのかという疑問に対する答えを本当に探しています。可視性がクラスに制限され、オブジェクトではないのはなぜですか?これはどのような利点がありますか? –

+0

私はちょうど今推測していますが、phpはmodifierの動作を含むjavaからの割り当てを借りています。多分Javaは型システムのためにクラスレベルでそれをやる必要があります。 Rubyがインスタンスレベルでそれを実行できる理由を説明しているかもしれません。しかし、再びその憶測。 – MrHus

答えて

3

privateは、そのオブジェクトだけでなく、そのクラスだけに限定されていることを意味します。

3

これはPHPの動作方法です。 Javaの仕組みと同じです。詳細については、http://php.net/manual/en/language.oop5.visibility.phpを参照してください。

+0

Javaがこのように動作するという事実は、実際にはPHPが同じように動作する有効な答えかもしれません。しかし、そのようなすべての言語に適用される本当の答えを知ることは面白いです。 –

1

この動作が便利なように見えたした唯一の状況は、factory機能にあった:

class Object 
{ 
    private $state; 

    public static function makeObject() 
    { 
     $obj = new Object; 
     $obj->state = 'some state'; 
     return $obj; 
    } 
} 

この場合であっても、よりよい解決策があると私は、それはスコープの違反であることをあなたとではないが同意それは私の意見では大きかった。結局のところ、クラスを書く人は引数として渡されたオブジェクトからプライベートメンバーにアクセスする必要があるかどうかを決定します。だから、それは役に立たないように見えるかもしれませんが、あなたは決して知りません。内部をサブクラスなどに公開しているようなものではありません。それはすべて同じクラスで起こり、あなたがそこでやっていることはあなたのビジネスです。

ところで、クラスごとではなくオブジェクトごとにアクセス修飾子を実装する言語の1つがRubyです。

関連する問題