我在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()
方法时,它会做两件事:
- 它重写
testPublic()
方法,因为它是公共的,Foo
有权用自己的版本重写它 - 它在
Bar
上调用test()
(因为test()
只存在于Bar()
上)
testPrivate()
是而不是重写的,并且是包含test()
的类的一部分。因此,打印Bar::testPrivate
testPublic()
被覆盖,并且是继承类的一部分。因此,打印Foo::testPublic
。
在某些情况下,很容易注意到您想要Bar类上的private方法,但您也希望Foo类来访问它。
但是等等,是公开的还是私人的
下面是protected修饰符
当一个方法是private时,只有类本身可以调用该方法
当一个方法public时,每个人都可以调用它,就像一个自由方
当一个方法被保护时,类本身可以调用它,而且任何拥有该方法的人(子对象)都可以将其作为自己的方法调用。
我几天前发布了同样的问题。。。因为这种行为对我来说也不合逻辑。$this总是引用它所使用的当前对象。在我看来,像这样的例子应该抛出一个错误或警告之类的东西。因为在上面的例子中,你实际上是在访问私人成员:SSS,它被认为是不可访问的!