2012-01-22 5 views
0

誰かがなぜこれが可能か教えていただけますか?プライベート属性は、クラス自体からのみ変更可能である必要があります。 s :: $ cは読み込み可能です(getC())が、なぜ私はそれに書き込むことができますか?プライベート属性(オブジェクト)の値を変更できるのはなぜですか?

<?php 

class s{ 

    private $c; 

    public function __construct() { 
     $this->c = new t; 
    } 

    public function getC() { 
     return $this->c; 
    } 

} 

class t { 

    public $a = 1; 
    public $b = 2; 

} 

$x = new s(); 

$x->getC()->a = 5; 

echo $x->getC()->a; 
?> 

出力:5

答えて

3

phpがオブジェクトを返すとき、それは重複しません。メモリ内のオブジェクトへのポインタ(参照)を返します。したがって、すべての変更は元のオブジェクトに影響します。それ

public function getC() { 
    return clone $this->c; 
} 
+0

OKこれは意味があります...しかし、配列を返すと、それは常にコピーです。 –

+0

はい、これはphpが動作する方法です(javaなどの言語とは異なり、基本的なもの以外のすべての型[int、char、byte etc ...]は参照渡しされます)。配列を参照渡しで渡したい場合は、varの名前の前に&を追加します(例: 'function changeArray(&$ array){...}')。 –

5

あなたはgetC()メソッドを公開することによって、$cを公開しました。今では誰でも/誰でもgetC()機能を使用して$cにアクセスできます。最初は公開されていたので誰でもいつでも$aにアクセスできました。あなたはクラスtの値$a$bが読み取り専用にしたい場合は


することは、あなたは、それらプライベートgetA()getB()などのアクセサメソッドを持つ各を作ることができます。例:

1

これが期待される動作を返す前に、あなたがオブジェクトのクローンを作成することができ、それを防ぐために

「プライベート」は、$x->cを直接使用できないことを意味します。 $x->getC()はsの関数なので、sのプライベートメンバーにアクセスできます。 getCは公開されているので、どこでもそのメソッドを呼び出すことができます。

簡潔に言えば、getC(Cの場合は「ゲッター」)を公開しているため、どこでもCの値を読み取ることができます。 はできません$x->getC() = 2;です。

関連する問題