Php 为什么私有方法没有被覆盖

Php 为什么私有方法没有被覆盖,php,Php,我试图执行官方php文档中的代码,但我不明白为什么privateBar方法没有被Foo覆盖? class Bar { public function test() { $this->testPrivate(); $this->testPublic(); } public function testPublic() { echo "Bar::testPublic\n"; } private f

我试图执行官方php文档中的代码,但我不明白为什么private
Bar
方法没有被
Foo
覆盖?
class Bar 
{
    public function test() {
        $this->testPrivate();
        $this->testPublic();
    }

    public function testPublic() {
        echo "Bar::testPublic\n";
    }

    private function testPrivate() {
        echo "Bar::testPrivate\n";
    }
}

class Foo extends Bar 
{
    public function testPublic() {
        echo "Foo::testPublic\n";
    }

    private function testPrivate() {
        echo "Foo::testPrivate\n";
    }
}

$myFoo = new Foo();
$myFoo->test();

打印
Bar::testPrivate Foo::testPublic
,但是为什么呢?

在PHP中,只能覆盖
public
受保护的
方法。不能覆盖
private
方法。

在您可能使用的同一文档的注释中

如果您在扩展内存中重写私有方法时遇到问题 类,请阅读以下内容:)

手册上说,“私有限制了只对 定义项目”。这意味着扩展的儿童课程看不到 父类的私有方法,反之亦然

因此,家长和孩子可以有不同的实现 “相同”的私有方法,具体取决于调用它们的位置(例如。 父类或子类实例)。为什么?因为私有方法是 仅对定义它们的类和子类可见 看不到父级的私有方法。如果孩子看不到 父级的私有方法,子级不能重写它们。范围是 不一样。换句话说,每个类都有一组私有的 其他人无权访问的变量

演示私有方法在以下情况下的特殊性的示例: 扩展类:


输出将是“基本”

如果希望继承的方法在中使用重写的功能 扩展类,但公共类听起来太松散,请使用受保护的。那是 它的用途:)

按预期工作的样品:

输出将是“child”。

请参阅原始注释

您不能覆盖私有方法,请使用
受保护
为此,请在问题标题中添加“PHP”,以帮助人们轻松找到您的问题。另外,请将“Overwrited”更改为“Overwrited”,因为这是一个众所周知的OOP术语。
<?php  abstract class base { 
     public function inherited() { 
         $this->overridden(); 
     } 
     private function overridden() { 
         echo 'base'; 
     }  } 

 class child extends base { 
     private function overridden() { 
         echo 'child'; 
     }  } 

 $test = new child();  $test->inherited();  ?> 
<?php  abstract class base { 
     public function inherited() { 
         $this->overridden(); 
     } 
     protected function overridden() { 
         echo 'base'; 
     }  } 

 class child extends base { 
     protected function overridden() { 
         echo 'child'; 
     }  } 

 $test = new child();  $test->inherited();  ?>  Output will be "child".