为啥可以从对象范围之外调用私有方法?

Posted

技术标签:

【中文标题】为啥可以从对象范围之外调用私有方法?【英文标题】:Why can you call a private method from outside of the object scope?为什么可以从对象范围之外调用私有方法? 【发布时间】:2015-01-19 21:40:50 【问题描述】:

我很好奇为什么允许这样做,您可以从对象范围之外调用并成功执行对象上的私有方法,前提是您从相同类型的类中进行调用。

对我来说,从公共范围调用私有方法似乎不满足私有方法的条件,那么为什么 php 和 Java 都允许这样做?

<?php

class A


    public function publicMethod ()
    
        $obj = new static;
        $obj->privateMethod ();
    

    private function privateMethod ()
    
        echo 'why does this execute?';
    



$obj = new A;
$obj->publicMethod ();

【问题讨论】:

您不是从外部调用它,而是从同一个对象中的方法调用它。 @Popnoodles 这不是同一个对象。 publicMethod 中的 $obj 和外部区域中的 $obj 是不同的变量(一个全局变量,一个局部变量。请参阅 PHP 手册中的 Variable Scope)。即使它们是同一个变量,您也可以清楚地看到 $obj 在 publicMethod 中被设置为 A 的新实例。 抛开语义不谈,私有方法是从公共方法私下调用的;它没有被公开调用。如果公共方法不能访问私有方法,那岂不是让私有方法变得多余了? 【参考方案1】:

相同类型的对象可以访问彼此的私有成员和受保护成员,即使它们不是相同的实例。这是因为在这些对象内部时,特定于实现的细节是已知的。

-- Visiblity, PHP 手册

【讨论】:

【参考方案2】:

Private 修饰符定义你在本地范围内调用的属性或方法我的意思是同一个类。 虽然它自己的类是唯一的调用者,但您可以在公共方法中使用它,然后在本地范围之外(所有者类)调用该公共方法

【讨论】:

以上是关于为啥可以从对象范围之外调用私有方法?的主要内容,如果未能解决你的问题,请参考以下文章

为啥允许静态方法调用私有方法?

C++ 为啥我可以从派生类调用基类的私有虚函数?

在 PHP 中,为啥可以在同一类类型的方法中创建的新实例上调用私有方法? [复制]

JAVA中,子类将继承父类的所有属性和方法吗?为啥?

为啥我不能在方法之外调用变量? [复制]

Spring AOP为啥不能拦截从对象内部调用的方法