Перейти к основному содержимому

PHP - Абстрактные классы и методы

Некоторые методы обретают смысл только тогда, когда дочерний класс дополнит детали. Именно таков абстрактный метод: родитель объявляет его, но не даёт реализации, оставляя эту работу дочернему классу или классам.

Класс хотя бы с одним абстрактным методом называется абстрактным классом. Его цель — заставить соблюдать правило: каждый производный класс (дочерний класс) обязан реализовать абстрактные методы, объявленные родителем.

И абстрактные классы, и абстрактные методы помечаются ключевым словом abstract.

Вот как это выглядит на практике:

Пример

Car является абстрактным классом и объявляет абстрактный метод intro(), который реализует каждый из двух его дочерних классов:

Prompt
Создайте абстрактный класс Car с публичным свойством $name, конструктором и абстрактным методом intro(). Затем создайте дочерние классы Audi и Citroen, каждый из которых реализует intro(), возвращая разную строку. Создайте объекты и выведите их представления через echo.
Вывод: PHP-скрипт

Разбор примера

Audi и Citroen расширяют абстрактный класс Car. Благодаря этому наследованию они могут использовать его публичное свойство $name и его публичный метод __construct().

С intro() всё иначе. Он абстрактный, поэтому каждый дочерний класс обязан предоставить собственную реализацию.


Замечания об абстрактных классах

Реализуя абстрактный метод, дочерний класс должен соблюдать несколько правил. Метод должен сохранить то же имя, а его модификатор доступа должен быть таким же или менее строгим. Например, абстрактный метод, объявленный как protected, может остаться protected или стать public в дочернем классе, но никогда не может стать private. Тип и количество обязательных аргументов также должны совпадать, хотя дочерний класс может свободно добавлять необязательные аргументы.

Итак, когда дочерний класс наследует абстрактный класс, действуют следующие правила:

  • Метод в дочернем классе имеет то же имя, что и абстрактный метод, и повторно объявляет его
  • Его модификатор доступа такой же, как у родителя, или менее строгий
  • Он принимает то же количество обязательных аргументов и может добавлять необязательные

PHP - Абстрактный метод с аргументом

Абстрактные методы тоже могут принимать аргументы. Как это работает, показывают следующие два примера:

Пример

Абстрактный метод объявляет один аргумент, $name, а дочерний класс реализует его с тем же аргументом:

Prompt
Создайте абстрактный класс ParentClass с абстрактным защищённым методом prefixName($name). Создайте класс ChildClass, который реализует prefixName и добавляет префикс Mr. или Mrs. в зависимости от имени. Проверьте на значениях John Doe, Jane Doe и Baby Doe.
Вывод: PHP-скрипт

Пример

Здесь дочерний класс добавляет два необязательных аргумента, которые не объявлены в абстрактном методе родителя:

Prompt
Создайте абстрактный класс ParentClass с абстрактным защищённым методом prefixName($name). Создайте класс ChildClass, который реализует prefixName с двумя необязательными дополнительными параметрами $separator и $greet. Проверьте на значениях John Doe и Jane Doe.
Вывод: PHP-скрипт