несколько способов вызова родительского метода в 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;
2 69
php

2 ответа:

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

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

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

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

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

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

    в этом случае, вы все еще хотите использовать `$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();
}

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

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

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