首页 > 解决方案 > 覆盖 PHP OOP 中的方法

问题描述

我不明白为什么要打印 // Bar::testPrivate 和 // Foo::testPublic .... "$this" 有优先权吗?我了解 Foo::testPublic 但 Bar::testPrivate 不要 在此处输入图像描述

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

标签: phpoop

解决方案


尽管Fooextends Barand是这里的and$myFoo的一个实例;是的一部分,并且在其中,因此无法从. 由于它不可访问,因此它在本地执行.Foo$this$myFootest()BartestPrivate()privateFooBarBar

请参阅PHP:可见性。页面中有一条评论,您在其中举例回答了您的问题。

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

因此,父母和孩子可以对“相同”的私有方法有不同的实现,这取决于你在哪里调用它们(例如,父类或子类实例)。为什么?因为私有方法只对定义它们的类可见,而子类看不到父类的私有方法。如果孩子看不到父母的私有方法,孩子就不能覆盖它们。范围不同。换句话说——每个类都有一组私有变量,其他人无法访问。


推荐阅读