I saw this in the PHP OOP manual http://www.php.net/manual/en/language.oop5.visibility.php and I can’t get my head around why the output is not: 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
It’s all about the visibility of the variables / methods.
You’ll notice that in the
Barclass, the methodtestPrivate()isprivate. That means that ONLY itself can access that method. No children.So when
FooextendsBar, and then asks to run thetest()method, it does two things:testPublic()method because it’s public, andFoohas the right to override it with it’s own version.test()onBar(sincetest()only exists onBar()).testPrivate()is not overridden, and is part of the class that holdstest(). Therefore,Bar::testPrivateis printed.testPublic()is overridden, and is part of the inheriting class. Therefore,Foo::testPublicis printed.