这里的代码输出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();
任何想法?
答案 0 :(得分:2)
Class可以始终访问自己的属性,无论它们属于实例本身还是属于另一个实例。这完全符合预期。
答案 1 :(得分:2)
出于封装的目的,重要的是保护类的内部不被代码的其他部分访问,这些部分必须不了解类的内部。该类本身可能知道它的内部结构,并且可以访问其自身实例的private
属性。
答案 2 :(得分:1)
这不是问题。你不是从外面访问私有财产,而是在课堂内并返回它。这个基本的OO。
答案 3 :(得分:1)
$obj->a = $val; //why this works?
它的作用是因为您使用myClass
和内部传递$obj_two
的对象,可以访问变量$a
的类,这非常精细< / p>
当您尝试以下操作时,强制执行访问私有变量的限制:
$obj_two = new myClass();
echo $obj_two->a;
答案 4 :(得分: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
的值。