Вызов переопределенного родительского метода

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

Ответы

Ответ 1

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

parent::test();

См родитель

Ответ 3

Просто установите уровни видимости в свойстве $ text.

private $text = "world\n";

Ответ 4

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

Реализация без вызова 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();

Ответ 5

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

Может быть, если у вас есть что-то вроде этого?

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