Вызов переопределенного родительского метода - PullRequest
24 голосов
/ 10 ноября 2011

В приведенном ниже примере кода метод 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();

Ответы [ 4 ]

34 голосов
/ 10 ноября 2011

Используйте parent:: перед именем метода, например

parent::test();

См. parent

4 голосов
/ 10 ноября 2011
parent::test();

(см. Пример № 3 в http://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php)

0 голосов
/ 15 января 2019

Вызов родительского метода может считаться плохой практикой или запахом кода и может указывать на логику программирования, которая может быть улучшена таким образом, что ребенку не нужно вызывать родителя. Хорошее общее описание предоставлено Wikipedia .

Реализация без вызова parent будет выглядеть следующим образом:

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();
0 голосов
/ 10 ноября 2011

Судя по твоим комментариям о пастбине, я бы сказал, что ты не можешь.

Может быть, если бы у вас было что-то подобное?

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();
    }
}
...