调用重写的父方法

时间:2011-11-10 00:07:21

标签: php object method-overriding

在下面的示例代码中,父类test()中的方法Foo被子类test()中的方法Bar覆盖。是否可以从Foo::test()致电Bar::test()

class Foo 
{
  $text = "world\n";

  protected function test() {
    echo $this->text;
  }
}// class Foo

class Bar extends Foo 
{
  public function test() {
    echo "Hello, ";

    // Cannot use 'parent::test()' because, in this case,
    // Foo::test() requires object data from $this
    parent::test();
  }
}// class Bar extends Foo

$x = new Bar;
$x->test();

5 个答案:

答案 0 :(得分:34)

在方法名称前使用parent::,例如

parent::test();

请参阅parent

答案 1 :(得分:4)

parent::test();

(参见http://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php上的示例#3)

答案 2 :(得分:0)

调用父方法可能被认为是不良习惯或代码异味,并且可能表明可以以某种方式改进的编程逻辑,即子级不必调用父方法。 Wikipedia提供了很好的通用描述。

不调用父级的实现将如下所示:

abstract class Foo
{
    $text = "world\n";

    public function test() {
        $this->test_child();
        echo $this->text;
    }

    abstract protected function test_child();
}// class Foo

class Bar extends Foo
{
    protected function test_child() {
        echo "Hello, ";
    }
}// class Bar extends Foo

$x = new Bar;
$x->test();

答案 3 :(得分:0)

只需在$ text属性中设置可见性级别即可。

private $text = "world\n";

答案 4 :(得分:-2)

根据你对pastebin的评论,我会说你做不到。

也许你有这样的东西?

class foo {
    public function foo($instance = null) {
        if ($instance) {
            // Set state, etc.
        }
        else {
            // Regular object creation
        }
}
class foo2 extends foo {
    public function test() {
        echo "Hello, ";
        // New foo instance, using current (foo2) instance in constructor
        $x = new foo($this);
        // Call test() method from foo
        $x->test();
    }
}