PHP手册OOP可见性示例 - 有人可以解释它

时间:2012-02-24 15:54:05

标签: php oop

我在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

3 个答案:

答案 0 :(得分:11)

所有关于变量/方法的可见性。

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

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

  1. 它会覆盖testPublic()方法,因为它是公开的,Foo有权使用它自己的版本覆盖它。
  2. 它会在test() 上调用Bar (因为test()只存在Bar())。
  3. testPrivate() 重写,并且是包含test()的类的一部分。因此,会打印Bar::testPrivate testPublic() 覆盖,并且是继承类的一部分。因此,会打印Foo::testPublic

答案 1 :(得分:1)

在某些情况下,您很容易注意到类需要私有方法,但您还需要 Foo 要访问它的类。
但等等,是公共还是私人?
这是受保护的修饰符。
当方法私有时,只有类本身才能调用该方法 当一种方法公开时,每个人都可以像自由党一样召唤它 当一个方法被保护时,类本身就可以调用它,并且无论是那个隐藏此方法的人(子)都可以将它作为自己的方法来调用。

答案 2 :(得分:-1)

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