可以在外面访问php私有属性

时间:2012-09-07 13:55:28

标签: php private-members

这里的代码输出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();

任何想法?

5 个答案:

答案 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的值。