为什么可以通过引用从外部类访问私有变量?

时间:2015-03-13 08:54:24

标签: php oop

如果我有一个返回对不可见(私有或受保护)属性的引用的公共类方法,我可以使用该引用来获得直接访问:

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模式是不可能的。

1 个答案:

答案 0 :(得分:2)

好吧, 显式返回对值的引用。您正在锁定前门,但随后打开侧门。你 非常故意瞄准并射击自己的脚。如果$property是一个对象,并且您使用或不使用&引用返回此对象,则对此对象的任何修改也会反映在$property上。这就是引用的工作原理,它总是修改引用指向的唯一现有值。

可见性修饰符不是魔术般的铁质"保护"。有多种方法可以规避private可见性以访问和修改属性。它们主要作为自己和其他开发人员的标志,不应该直接访问此属性,它是供内部使用的,而不是公开认可的API。并且PHP会打耳光如果你忘了那个,你就在手腕上。没什么,没什么。

此外,这里没有任何事实被侵犯。外部代码无法访问或修改$obj->property。这是private应该禁止的唯一事情。您实际上在对象上公开了一个修改private属性的公共API。通常这是通过getter和setter函数完成的,但是by-reference API显然也能正常工作。