如果我的公共类方法返回对不可见(私有或受保护)属性的引用,则可以使用该引用直接访问:
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/

10-09 06:12
查看更多