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

类总是可以访问它自己的属性,无论它们是属于实例本身还是属于另一个实例。这完全符合预期。

于 2012-09-07T14:00:08.773 回答
2

出于封装的目的,重要的是要保护类的内部不被其他不知道该类内部的代码部分访问。类本身大概知道它的内部结构,并且可以private很好地访问自身实例的属性。

于 2012-09-07T14:03:34.123 回答
1

这不是问题。您不是从外部访问私有财产,而是在班级内部访问并返回它。这个基本的OO。

于 2012-09-07T14:00:25.620 回答
1

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

它之所以有效,是因为您正在传递一个myClassusing对象,$obj_two并且$a类内部可以访问该变量,这非常好

当您尝试以下操作时,会强制执行访问私有变量的限制:

$obj_two = new myClass();
echo $obj_two->a;
于 2012-09-07T14:01:08.637 回答
0
$obj_one->changeValue(20, $obj_two);
$obj_two->changeValue($obj_two->getValue(), $obj_one);

在这两行中,$obj 都不为 null,因此执行 else 部分。在第一次调用$this->a = 20期间和第二次调用期间,当您使用$obj_two->getValue()它时,将检索$obj_two->a调用第一个函数时设置的值。

于 2012-09-07T14:01:39.100 回答