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

Joh*_*isz 5 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();
Run Code Online (Sandbox Code Playgroud)

PHP 中的此功能背后是否有原因?还是只是设计上的疏忽,未能通过引用跟踪访问冲突?

当您想要实现以下目标时,它显然会派上用场:

PHP代码

$this->load->resource();
Run Code Online (Sandbox Code Playgroud)

哪里load是修改给定属性的对象$this。但是除了这个快捷方式,我没有看到很多可能的用途,否则有效的 OOP 模式是不可能的。

dec*_*eze 5

那么,你明确返回值的参考。您正在锁前门,但随后打开了侧门。你很刻意瞄准和射击在这里你自己的脚。如果$property是一个对象,并且您会在有或没有&引用的情况下返回此对象,则对此对象的任何修改也会反映出来$property。这就是引用的工作方式,它总是修改引用指向的一个且唯一的现有值。

能见度修饰符不是魔法铁甲“保护”。您可以通过多种方式绕过private可见性来访问和修改属性。它们主要是向您自己和其他开发人员表明不应直接访问此属性,它仅供内部使用,而不是公开批准的 API。如果您忘记了这一点,PHP 会打您一巴掌。不多也不少。

此外,这里并没有真正受到侵犯。外部代码绝不能访问或修改$obj->property. 这是唯一private应该禁止的事情。您本质上是在修改private属性的对象上公开一个公共 API 。通常这是通过 getter 和 setter 函数完成的,但按引用 API 显然也能工作。