Подтвердить что ты не робот

Несколько способов вызова родительского метода в php

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

Теперь мне интересно, есть ли предпочтительный способ (например, лучший способ) вызова метода (через parent или this) и независимо от того, действительно ли это идентичные способы выполнения одного и того же кода или если есть какие-либо оговорки при использовании одного над другим.

Извините, я, наверное, подумал об этом.

abstract class Animal {

    function get_species() {

        echo "test";

    }

}

class Dog extends Animal {

    function __construct(){

        $this->get_species();
        parent::get_species();

    }

}

$spike = new Dog;
4b9b3361

Ответ 1

Существует три сценария (я могу думать), в которых вы бы вызвали метод в подклассе, где метод выходит из родительского класса:

  • Метод не перезаписывается подклассом, существует только в родительском.

    Это то же самое, что и ваш пример, и, как правило, лучше использовать $this -> get_species();. Вы правы, что в этом случае два фактически одинаковы, но метод был унаследован подклассом, поэтому нет причин для дифференцироваться. Используя $this, вы остаетесь согласованным между унаследованными методами и локально объявленными методами.

  • Метод перезаписывается подклассом и имеет полностью уникальную логику от родителя.

    В этом случае вы, очевидно, захотите использовать $this -> get_species();, потому что вы не хотите, чтобы родительская версия метода была выполнена. Опять же, последовательно используя $this, вам не нужно беспокоиться о различии между этим случаем и первым.

  • Метод расширяет родительский класс, добавляя к тому, что достигает родительский метод.

    В этом случае вы все равно хотите использовать `$this -> get_species(); при вызове метода из других методов подкласса. Одно место, которое вы вызовете родительским методом, будет из метода, который переписывает родительский метод. Пример:

    abstract class Animal {
    
        function get_species() {
    
            echo "I am an animal.";
    
        }
    
     }
    
     class Dog extends Animal {
    
         function __construct(){
    
             $this->get_species();
         }
    
         function get_species(){
    
             parent::get_species();
             echo "More specifically, I am a dog.";
         }
    }
    

Единственный сценарий, который я могу себе представить, когда вам нужно будет вызвать родительский метод непосредственно за пределами метода переопределения, будет, если они сделали две разные вещи, и вы знали, что вам нужна родительская версия метода, а не локальная. Это не должно быть так, но если бы это было само собой, то простой способ приблизиться к этому - создать новый метод с таким именем, как get_parentSpecies(), где все, что он делает, это вызвать родительский метод:

function get_parentSpecies(){

     parent::get_species();
}

Опять же, это сохраняет все приятное и последовательное, что позволяет изменять/изменять локальный метод, а не полагаться на родительский метод.

Ответ 2

Если я не понимаю вопрос, я почти всегда буду использовать $this- > get_species, потому что подкласс (в данном случае собака) может перезаписать этот метод, поскольку он его расширяет. Если собака класса не переопределяет метод, то оба способа функционально эквивалентны, но если в какой-то момент в будущем вы решите, что хотите, чтобы метод get_species на собаке печатал "собаку", вам нужно было бы пройти через весь код и Измени это.

Когда вы используете $this, это фактически часть объекта, который вы создали, и поэтому всегда будет самым последним (если используемое свойство каким-то образом изменилось в течение жизни объекта), тогда как использование родительский класс вызывает метод статического класса.