我在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
答案 0 :(得分:11)
所有关于变量/方法的可见性。
您会注意到,在Bar
课程中,方法testPrivate()
为private
。这意味着ONLY本身可以访问该方法。没有孩子。
因此当Foo
扩展Bar
,然后要求运行test()
方法时,它会做两件事:
testPublic()
方法,因为它是公开的,Foo
有权使用它自己的版本覆盖它。test()
上调用Bar
(因为test()
只存在Bar()
)。 testPrivate()
被 重写,并且是包含test()
的类的一部分。因此,会打印Bar::testPrivate
testPublic()
被覆盖,并且是继承类的一部分。因此,会打印Foo::testPublic
。
答案 1 :(得分:1)
在某些情况下,您很容易注意到栏类需要私有方法,但您还需要 Foo 要访问它的类。
但等等,是公共还是私人?
这是受保护的修饰符。
当方法私有时,只有类本身才能调用该方法
当一种方法公开时,每个人都可以像自由党一样召唤它
当一个方法被保护时,类本身就可以调用它,并且无论是那个隐藏此方法的人(子)都可以将它作为自己的方法来调用。
答案 2 :(得分:-1)
我几天前发布了同样的问题......因为这种行为对我来说也不符合逻辑。 $ this总是被引用到它所使用的当前对象。在我看来,这样的例子应该抛出错误或警告或其他东西。因为在上面的例子中你实际上是访问私人成员:SSS被认为是无法访问的!