如果我的公共类方法返回对不可见(私有或受保护)属性的引用,则可以使用该引用直接访问:
php代码
class A
{
private $property = 'orange';
public function &ExposeProperty()
{
return $this->property;
}
public function Output()
{
echo $this->property;
}
}
$obj = new A();
# prints 'orange'
$obj->Output();
$var = &$obj->ExposeProperty();
$var = 'apple';
# prints 'apple'
$obj->Output();
在php中,这个功能背后有什么原因吗?还是仅仅是设计上的疏忽,没有通过引用来跟踪访问违规?
当你想要实现以下目标时,它显然会派上用场:
php代码
$this->load->resource();
其中
load
是修改$this
的给定属性的对象。但是除了这个快捷方式之外,我看不到很多其他有效的oop模式不可能实现的用途。 最佳答案
好吧,您显式地返回对值的引用。你把前门锁上,然后打开一个侧门。你在这里故意瞄准自己的脚。如果$property
是一个对象,并且返回该对象时带有或不带有&
引用,则对该对象的任何修改也将反映在$property
上。这就是引用的工作方式,它总是修改引用指向的唯一的现有值。
可见性修改器不是神奇的铁壳“保护”。有很多方法可以绕过private
可见性来访问和修改属性。它们主要是作为你和其他开发人员的一个标志,这个属性不应该被直接访问,它是供内部使用的,而不是一个公开认可的api。如果你忘记了这一点,php会给你一记耳光。没有更多,没有更少。
而且,这里没有什么真正被侵犯的。外部代码不能访问或修改$obj->property
。这是private
唯一应该禁止的。实际上,您在对象上公开了一个修改private
属性的公共api。通常这是通过getter和setter函数完成的,但是按引用api显然也可以工作。
关于php - 为什么可以通过引用从外部类访问私有(private)变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29028188/