【问题标题】:override methods in PHP OOP覆盖 PHP OOP 中的方法
【发布时间】:2021-12-07 15:11:03
【问题描述】:

我不明白为什么要打印 // Bar::testPrivate 和 // Foo::testPublic .... "$this" 有优先权吗?我了解 Foo::testPublic 但 Bar::testPrivate 不了解 enter image description here

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 oop


【解决方案1】:

尽管Foo 扩展了Bar$myFooFoo$this 的实例,但这里指的是$myFootest()Bar 的一部分,testPrivate()privateFoo 中的一部分,因此无法从 Bar 访问。由于它不可访问,它在Bar 本地执行。

PHP: Visibility。在您回答问题的示例页面中有一个comment

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-07
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多