Метод определения метода наследования PHP

<?php
class A {
    private function foo() {
        echo "baf!<br/>";
    }
    public function test() {
        $this->foo();

    }
}


class C extends A {
    private function foo() {
        echo "bar!<br/>";
    }

}

$c = new C();
$c->test();  //Prints baf!
?> 

Как сделать c->test() для печати строки!? Я ожидал, что foo() будет переопределено в C и будет печатать панель! может кто-нибудь объяснить это мне?

Ответ 1

Используя оба метода защиты, вы достигнете желаемого результата; причина в том, что в пределах A::test() он может разрешить только $this->foo() до A::foo() из-за видимости private. См. Visibility.

class A {
    protected function foo() {
        echo "baf!<br/>";
    }
    public function test() {
        $this->foo();

    }
}


class C extends A {
    protected function foo() {
        echo "bar!<br/>";
    }

}

$c = new C();
$c->test();  //Prints bar!

Ответ 2

class A {
    protected function foo() {
        echo "baf!<br/>";
    }
    public function test() {
        $this->foo();

    }
}


class C extends A {
    protected function foo() {
        echo "bar!<br/>";
    }

}
$c = new C();
$c->test();  //Prints baf!

просто сделайте обе функции foo общедоступной или защищенной.