X

PHP: Как вызвать метод родителя, родителя.

Сегодня, мне задали один интересный вопрос: Как вызвать метод, который объявлен в родительском классе, родительского класса? ..

Думаю, многим вопрос будет понятен на примере, поэтому вот он

class A {
    public function abc(){
        echo 'A';
    }
}

class B extends A {
    public function abc(){
        echo 'B';
    }
}

class C extends B {
    public function abc(){
        // тут надо вызвать метод из класса A
    }
}

Когда-то я уже сталкивался с подобной проблемой, но к сожалению контекст уже забыл. Тогда я решил проблему, добавив метод, в класс родителя, который вызовет класс своего родителя. Что-то типа

class A {
    public function abc(){
        echo 'A';
    }
}

class B extends A {
    public function abc(){
        echo 'B';
    }
    public function abc_a(){ 
        parent::abc(); 
    }
}

class C extends B {
    public function abc(){
        parent::abc_a();
    }
}

В этот раз мне сказали, что в данном случае ожидается другое решение, без изменения класса. Ответить я не смог, но, к счастью, мне рассказали о нем. Оказывается, в контексте наследника можно вызывать метод родительского класса любой вложенности, через замену parent на имя нужного класса.

class A {
    public function abc(){
        echo 'A';
    }
}

class B extends A {
    public function abc(){
        echo 'B';
    }
}

class C extends B {
    public function abc(){
        A::abc();
    }
}

(new С)->abc(); // Выведет "A"

По истине, век живи - век учись. Изящное решение, больше похожее на какой-то хак 🙂

Категории: PHP