为什么私有方法不会被覆盖

时间:2017-03-30 10:11:15

标签: php

我正在尝试从官方php文档执行代码,但我无法理解为什么私有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,但为什么?

2 个答案:

答案 0 :(得分:1)

在同一文档的评论中,您可以使用

  

如果您在扩展中覆盖私有方法时遇到问题   上课,读这个:)

     

手册说“私人限制仅对该类别的可见性   定义项目“。这意味着扩展的子类没有看到   父类的私有方法,反之亦然。

     

因此,父母和孩子可以有不同的实现   “相同的”私人方法,取决于你称之为的地方(例如   父或子类实例)。为什么?因为私有方法是   仅对定义它们的类和子类具有可见性   没有看到父母的私人方法。如果孩子没有看到   父母的私人方法,孩子不能覆盖他们。范围是   不同。换句话说 - 每个班级都有一套私人私人   没有其他人可以访问的变量。

     

展示私人方法的时间性的样本   扩展课程:

<?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".

请参阅Php docs了解原始评论

答案 1 :(得分:0)

在PHP中,只有publicprotected方法可以被覆盖。不是private个。