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

4

2 回答 2

5

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

  1. testPublic- 这是一个公共的,所以它在Foo. 所以Foo::testPublic被称为
  2. testPrivate- 这是一个私人的,所以它只对每个班级本身可见。对于调用方方法(它是Bar) - 它是Bar::testPrivate

所以 - 如果方法是publicprotected- 它可以被覆盖并从祖先/孩子调用;如果是private- 它不能。

于 2013-01-16T20:26:40.833 回答
0

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

$this->testPublic();

它将为实现该功能的最顶层类调用 testPublic()。

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

父::testPublic();

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

注意不要将 -> 运算符与 :: 运算符混淆。

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

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

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

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

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

于 2013-01-16T20:28:30.390 回答