请帮助我在php.net网站上使用这个oop代码

时间:2013-10-31 00:56:45

标签: php oop

我不明白为什么代码的第一个输出打印“Bar :: testPrivate”,因为我们使用子类的instance.So调用父类的测试方法,当在测试中调用第一行代码时函数是“$ this-> testPrivate();”应该调用子类的testPrivate方法,因此打印“Foo :: testPrivate”而不是“Bar :: testPrivate”。

<pre>
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



</pre>

2 个答案:

答案 0 :(得分:1)

您的班级Foo没有test()方法。您可以致电$myFoo->test(),因为方法test()是从类Bar继承的。您必须覆盖类test()中的方法Foo,就像使用方法testPrivate()testPublic()一样。

你正在调用基类的方法是正确的,但在这种情况下Bar是你的基类。查看示例here

答案 1 :(得分:1)

如果您希望从基类(父)类继承所有函数,那么您应该在子类中显式调用它的构造函数。否则,您将需要覆盖这些方法。此外,当使用实际实例(即您创建了一个对象)时,声明为private的函数仅对该类可用。对将继承该函数的类使用protected。 e.g:

class Foo {

    public function __construct() {
        echo "Foo constructed...\n";
        $this->fooOnly();
    }

    private function fooOnly() {
        echo "Called 'fooOnly()'\n";  //Only available to class Foo
    }

    protected function useThisFoo() {
        echo "Called 'useThisFoo()'\n";  //Available to Foo and anything that extends it.
    }

}

class Bar extends Foo {

    public function __construct() {
        parent::__construct();  //Now Bar has everything from Foo
    }

    public function testFooBar() {
        //$this->fooOnly(); //Fail - private function
        $this->useThisFoo(); //Will work - protected function is available to Foo and Bar
    }

}

$bar = new Bar();
$bar->testFooBar();  //Works - public function will internally call protected function.
//$bar->fooOnly();  //Fail - private function can't be accessed in global space
//$bar->useThisFoo();  //Fail again - protected function can't be access in global space