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

Posted

技术标签:

【中文标题】在 PHP 中,为啥可以在同一类类型的方法中创建的新实例上调用私有方法? [复制]【英文标题】:Why can you call a private method on a new instance made inside a method of the same class type, in PHP? [duplicate]在 PHP 中,为什么可以在同一类类型的方法中创建的新实例上调用私有方法? [复制] 【发布时间】:2022-01-23 14:35:55 【问题描述】:

为什么可以在同一类类型的公共方法中创建的新实例上调用私有方法?

class Foo

    private function thePrivateMethod()
    
        echo 'can not be called publicly?';
    

    public function thePublicMethod()
    
        $clone = new Foo;
        $clone->thePrivateMethod();
    


$foo = new Foo();
$foo->thePublicMethod();
$foo->thePrivateMethod();

以上在 php 7.3.18 中运行时会产生以下输出

can not be called publicly?

Fatal error:  Uncaught Error: Call to private method Foo::thePrivateMethod() from context

直觉上,我预计对Foo::thePrivateMethod() 的第一次调用也会导致致命错误。但我无法在文档中找到允许这种行为?

【问题讨论】:

php.net/manual/en/…: "相同类型的对象将可以访问彼此的私有成员和受保护成员,即使它们不是相同的实例。这是因为实现的具体细节是已知的当在那些物体里面时。” 好吧,这就是答案,它是故意内置到 php 中的。 @gawpertron:也许您可以添加更多关于您对致命错误(不存在)的期望的上下文? 【参考方案1】:

基本上,遵循面向对象的范例,您始终可以在自己的类中调用私有或受保护的方法。 下表可以更好地解释“为什么会这样?”背后的概念

第一次,您调用一个公共方法,该方法在类的上下文中调用一个私有方法,所以它是允许的。 第二次,直接调用私有方法,类外是不允许的。

是同一个概念的attributes,如果在类中声明aprivate $test,就不能通过 $foo = new Foo();$foo -> test;

但是,您需要声明一个为您执行此操作的公共方法,然后调用它以获取 $test 的值:$foo -> getTest();

注意。因为你已经在类的上下文中初始化了对象,所以它总是被允许的。

【讨论】:

以上是关于在 PHP 中,为啥可以在同一类类型的方法中创建的新实例上调用私有方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C#winform中为啥一个窗体的对象可以调用在另一个窗体中创建的一个类未实例化下

在 post_init 中创建的数据类的属性的访问类型提示

Navicat 8 for MySQL中创建的表为啥在mysql数据库中没有

为什么不能引用在Swift项目的同一目录中创建的类或结构?

Java Static

我在 vb6(winsock) 中创建的客户端/服务器程序不能在 WAN 上运行,但可以在 LAN 上完美运行 为啥?