Как переопределение метода работает, когда класс наследует класс? - PullRequest
0 голосов
/ 03 сентября 2018

Давайте иметь в виду эти два прекрасных класса!

class Bar 
{
    public function test() {
        echo "<br>";
        $this->testPrivate();
        $this->testPublic();
    }

    public function testPublic() {
        echo "Bar::testPublicn";
    }

    private function testPrivate() {
        echo "Bar::testPrivaten";
    }

    public function ShowBar() {
        $this->testPrivate();
    }
}

class Foo extends Bar 
{
    public function testPublic() {
        echo "Foo::testPublicn";
    }

    private function testPrivate() {
        echo "Foo::testPrivaten";
    }

    public function ShowFoo() {
        $this->testPrivate();
    }
} 
$myFoo = new Foo();
$myFoo->test();

echo "<br>"; 
$myFoo->ShowBar();

echo "<br>"; 
$myFoo->ShowFoo(); 

Кто-нибудь желает объяснить, каковы выходные значения и почему?

Я смотрю на этот код ... Он печатает "Bar :: testPrivatenFoo :: testPublicn"! Зачем? Как я думаю увидеть этот результат? Открытый метод перегружен, закрытый метод не перегружен.

Хорошо, поэтому ShowBar (), как я ожидал, выведет "Bar :: testPrivaten" Выводит "Bar :: testPublicn", отлично.

Хорошо, поэтому ShowFoo (), как я ожидаю, выдаст «Bar :: testPrivaten» но на самом деле выводит "Foo :: testPublicn". Хм, почему?

1 Ответ

0 голосов
/ 03 сентября 2018

Следующий фрагмент кода вызовет метод test () в классе Bar, поскольку вы не переопределяете метод test () в классе Foo

$myFoo = new Foo();
$myFoo->test();

Следовательно, этот метод будет запущен из класса Бар

public function test() {
    echo "<br>";
    $this->testPrivate();
    $this->testPublic();
}

Когда вы вызываете $ this-> testPrivate (), он выведет testPrivate () из Bar как Bar :: testPrivaten, поскольку частные методы являются частными для класса и не могут быть переопределены

Далее вы вызываете $ this-> testPublic (). Поскольку вы уже переопределили этот метод в классе Foo, он вызовет метод testPublic () из Foo чем Bar. Следовательно, он будет печатать Foo :: testPublicn

Итак, вы закончите как Bar :: testPrivatenFoo :: testPublicn

Но для этого нет никаких шансов

Ok, so ShowBar() I would expect will output "Bar::testPrivaten" It outputs "Bar::testPublicn", great.
Ok, so ShowFoo() I would expect will output "Bar::testPrivaten" but it actually outputs "Foo::testPublicn".

Я только что проверил ваш код и получил следующее

Bar::testPrivatenFoo::testPublicn
Bar::testPrivaten
Foo::testPrivaten

Пожалуйста, не забудьте дать правильный результат

...