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

标签 php oop

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

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 是一个对象,并且您将返回带有或不带有 & 引用的对象,对该对象的任何修改都会反射(reflect)在 $property以及。这就是引用 的工作方式,它总是修改引用指向的唯一一个现有值。

能见度修饰符不是魔法铁甲“保护”。有许多方法可以绕过 private 可见性来访问和修改属性。它们主要是作为您自己和其他开发人员的标志,不应直接访问此属性,它仅供内部使用,而不是公开认可的 API。如果您这样做,PHP 会拍打您的手腕忘了那个。仅此而已。

此外,这里并没有真正违反任何内容。外部代码绝不会访问或修改 $obj->property。这是 private 唯一应该禁止的事情。您实质上是在修改 private 属性的对象上公开一个公共(public) API。通常这是通过 getter 和 setter 函数完成的,但通过引用 API 显然也可以。

关于php - 为什么可以通过引用从外部类访问私有(private)变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29028188/

相关文章:

php - 具有自己属性的特征

php - Preg 匹配方括号和 @strings 内的字符串

php - 如何从屏幕截图中隐藏 CSS 模态叠加层

perl - 如何组织 Perl 对象的私有(private)方法?

android - 传入参数时 Kotlin 类型不匹配

php - Magento 中的信用卡详细信息

php - 使用 php 的 Youtube iframe 视频

python - 我的 python 程序运行得非常慢

php - 在 Controller 之间切换(MVC)

c++ - 指向基类的唯一指针