PHP手动OOP可见性示例-有人能解释一下吗


PHP manual OOP visibility example - can someone explain it

我在PHP OOP手册中看到了这一点http://www.php.net/manual/en/language.oop5.visibility.php我无法理解为什么输出不是:Foo::testPrivate Foo::testPublic

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

这一切都与变量/方法的可见性有关。

您会注意到,在Bar类中,方法testPrivate()private。这意味着ONLY本身可以访问该方法。没有孩子。

因此,当Foo扩展Bar,然后要求运行test()方法时,它会做两件事:

  1. 它重写testPublic()方法,因为它是公共的,Foo有权用自己的版本重写它
  2. 它在Bar上调用test()(因为test()只存在于Bar()上)

testPrivate()而不是重写的,并且是包含test()的类的一部分。因此,打印Bar::testPrivate
testPublic()被覆盖,并且是继承类的一部分。因此,打印Foo::testPublic

在某些情况下,很容易注意到您想要Bar类上的private方法,但您也希望Foo类来访问它。
但是等等,是公开的还是私人的
下面是protected修饰符
当一个方法是private时,只有类本身可以调用该方法
当一个方法public时,每个人都可以调用它,就像一个自由方
当一个方法被保护时,类本身可以调用它,而且任何拥有该方法的人(子对象)都可以将其作为自己的方法调用。

我几天前发布了同样的问题。。。因为这种行为对我来说也不合逻辑。$this总是引用它所使用的当前对象。在我看来,像这样的例子应该抛出一个错误或警告之类的东西。因为在上面的例子中,你实际上是在访问私人成员:SSS,它被认为是不可访问的!