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


Why is it possible to access private variables from outside class by reference?

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

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唯一应该禁止的事情。您实际上是在对象上公开一个公共 API,该 API 修改了 private 属性。通常这是通过 getter 和 setter 函数完成的,但按引用 API 显然也可以工作。