难以理解如何在扩展类中声明父类的函数?

时间:2013-01-16 20:23:14

标签: php oop

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,并想知道如何使用扩展来覆盖父类函数。

2 个答案:

答案 0 :(得分:5)

test()方法调用2个方法:

  1. testPublic - 它是公开的,因此在Foo中被覆盖。所以Foo::testPublic被称为
  2. testPrivate - 它是私有的,所以它只对每个类本身可见。对于调用者方法(Bar) - 它是Bar::testPrivate
  3. 所以 - 如果方法是publicprotected - 它可以被覆盖并从祖先/孩子调用;如果它是private - 它不能。

答案 1 :(得分:0)

$ this 引用当前对象。因此,当您执行以下操作时。

  

$这 - > testPublic();

它将调用testPublic()以获取实现该功能的 top 最多的类。

如果您只想调用父类,那么就有父关键字。

  

父:: testPublic();

这会在当前对象下面的类上调用testPublic()。

完全不要混淆 - >运算符与:: operator。

::运算符引用对象的定义,其中as - >引用对象的实例。

 self::testPublic();
 $foo::testPublic();

引用一个名为testPublic()的静态函数,静态方法在类级别定义。

 $foo->testPublic();
 $this->testPublic();

它引用一个函数作为对象实例的一部分,并且有一个vtable用于查找应该调用哪个对象实例级别。