2012-01-22 38 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

确定这是有道理的......但是,如果我返回一个数组,它总是一个副本,不是吗? –

+0

是的,这是php的工作方式(不像java这样的语言,除了基本类型[int,char,byte等]以外的所有类型都通过引用传递),在php中只有对象通过引用传递。如果你想要一个数组通过引用来传递,那么在var的名字之前加上&function function changeArray(&$ array){...} –

5

您已经通过使getC()方法公开暴露$c。现在任何人/任何人都可以通过使用getC()函数访问$c,任何人都可以一直访问$a,因为它首先是公开的。


如果你想要的值$at类的$b被只读,那么你可以让他们私人,每个像getA()getB()的存取方法。例如:

class s { 
    private $c; 

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

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

class t { 
    private $a = 1; 
    private $b = 2; 

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

    public function getB() { 
     return $this->b; 
    } 
} 
1

这是预期行为之前。

“私人”表示您不能直接使用$x->c$x->getC()是s的函数,因此可以访问s的私有成员。 getC是公开的,因此您可以在任何地方调用该方法。

总之,因为你公开了getC(C为“getter”),所以你可以在任何地方读取C的值。你不能做的是$x->getC() = 2;

相关问题