为什么可以在相同类类型的公共方法内部的新实例上调用私有方法?
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();
当在PHP7.3中运行时,上述结果将产生以下输出。18
can not be called publicly?
Fatal error: Uncaught Error: Call to private method Foo::thePrivateMethod() from context
直观地说,我希望对Foo::thePrivateMethod()
的第一次调用也会导致致命错误。但我在文件中找不到这种行为是允许的?
基本上,遵循面向对象的范例,您总是可以在自己的类中调用私有或受保护的方法。这里有一个表格可以更好地解释“为什么这样做有效”背后的概念
第一次,您调用一个公共方法,该方法在类的上下文中调用一个私有方法,因此这是允许的。第二次,您直接调用一个私有方法,这在类之外是不允许的。
是相同的属性概念,如果你在类中声明一个私有$test
,你不能通过$foo=new Foo()访问它;$foo-
但是相反,您需要声明一个为您执行此操作的公共方法,然后调用它以获取$test
:$foo的值-
注意。因为您已经在类的上下文中初始化了对象,所以它总是被允许的。