【发布时间】: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