class Bar{
public function test(){
$this->testPublic();
$this->testPrivate();
}
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();
//Foo::testPublic
//Bar::testPrivate
我在理解这个输出时遇到了很多麻烦。有人能够给我一个明确的简洁解释是什么吗?我正在学习OOP,并想知道如何使用扩展来覆盖父类函数。
答案 0 :(得分:5)
test()
方法调用2个方法:
testPublic
- 它是公开的,因此在Foo
中被覆盖。所以Foo::testPublic
被称为testPrivate
- 它是私有的,所以它只对每个类本身可见。对于调用者方法(Bar
) - 它是Bar::testPrivate
所以 - 如果方法是public
或protected
- 它可以被覆盖并从祖先/孩子调用;如果它是private
- 它不能。
答案 1 :(得分:0)
$ this 引用当前对象。因此,当您执行以下操作时。
$这 - > testPublic();
它将调用testPublic()以获取实现该功能的 top 最多的类。
如果您只想调用父类,那么就有父关键字。
父:: testPublic();
这会在当前对象下面的类上调用testPublic()。
完全不要混淆 - >运算符与:: operator。
::运算符引用对象的类定义,其中as - >引用对象的实例。
self::testPublic();
$foo::testPublic();
引用一个名为testPublic()的静态函数,静态方法在类级别定义。
$foo->testPublic();
$this->testPublic();
它引用一个函数作为对象实例的一部分,并且有一个vtable用于查找应该调用哪个对象实例级别。