【问题标题】: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:也许您可以添加更多关于您对致命错误(不存在)的期望的上下文?

标签: php oop private-methods public-method


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-10-23
    • 2011-11-11
    • 2017-06-11
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2010-11-29
    相关资源
    最近更新 更多