1

ここのコードは 20, 20 を出力します。ここで非公開プロパティにアクセスできる理由:

class myClass {
    private $a;

    public function __construct() {
      $this->a = 10;
    }

    public function printValue() {
       print "The Value is: {$this->a}\n";
    }

    public function changeValue($val, $obj = null) {
        if(is_null($obj)) {
            $this->a = $val;
        } else {
           $obj->a = $val; //why this works?
        }
     }

    public function getValue() {
      return $this->a;
     }
 }

 $obj_one = new myClass();
 $obj_two = new myClass();

 $obj_one->changeValue(20, $obj_two);
 $obj_two->changeValue($obj_two->getValue(), $obj_one);

 $obj_two->printValue();
 $obj_one->printValue();

何か案は?

4

5 に答える 5

2

カプセル化のためには、クラスの内部を認識してはならないコードの他の部分によるアクセスから、クラスの内部を保護することが重要です。クラス自体はおそらくその内部構造を認識しており、privateそれ自体のインスタンスのプロパティに問題なくアクセスできます。

于 2012-09-07T14:03:34.123 に答える
2

クラスは、インスタンス自体に属しているか、別のインスタンスに属しているかに関係なく、常に独自のプロパティにアクセスできます。これは意図したとおりに機能します。

于 2012-09-07T14:00:08.773 に答える
1

$obj->a = $val; //why this works?

myClass使用するオブジェクトを渡し$obj_two、クラス$aで変数にアクセスできるため、機能します。これは完全に問題ありません

次のようなことを試みると、プライベート変数へのアクセスの制限が適用されます。

$obj_two = new myClass();
echo $obj_two->a;
于 2012-09-07T14:01:08.637 に答える
1

これは問題ではありません。外部からプライベート プロパティにアクセスするのではなく、クラス内でそれを返します。この基本的な OO.

于 2012-09-07T14:00:25.620 に答える
0
$obj_one->changeValue(20, $obj_two);
$obj_two->changeValue($obj_two->getValue(), $obj_one);

どちらの行でも $obj は null ではないため、else 部分が実行されます。の最初の呼び出し$this->a = 20時と 2 回目の呼び出し時に使用する値は、最初の関数を呼び出したときに設定され$obj_two->getValue()た値を取得します$obj_two->a

于 2012-09-07T14:01:39.100 に答える