несколько способов вызова родительского метода в 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 ответа:
есть три сценария (которые я могу придумать), где вы могли бы вызвать метод в подклассе, где метод выходит из родительского класса:
метод не перезаписывается подклассом, существует только в Родительском.
это то же самое, что и ваш пример, и вообще лучше использовать
$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(); }
опять же, это сохраняет все хорошее и последовательное, позволяя вносить изменения / модификации в локальный метод, а не полагаться на родительский метод.
Если я не ошибаюсь в вопросе, я почти всегда буду использовать $this->get_species, потому что подкласс (в данном случае dog) может перезаписать этот метод, поскольку он расширяет его. Если класс dog не переопределяет метод, то оба способа функционально эквивалентны, но если в какой-то момент в будущем вы решите, что метод get_species в dog должен печатать "dog", тогда вам придется вернуться через весь код и изменить его.
когда вы используете $this это на самом деле часть объекта, который вы создали, и поэтому всегда будет самой актуальной (если используемое свойство каким-то образом изменилось за время существования объекта), тогда как использование родительского класса вызывает метод статического класса.