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

PHP — Наследование

При наследовании дочерний класс получает все публичные и защищённые свойства и методы родительского класса и может добавлять собственные свойства и методы.

Примечание: Дочерний класс не имеет доступа к приватным методам родителя.

Чтобы создать унаследованный класс, используйте ключевое слово extends.

В следующем примере Strawberry расширяет Fruit. Благодаря наследованию он может использовать публичные свойства $name и $color и публичные методы __construct() и intro() из Fruit. Кроме них, Strawberry определяет ещё один собственный метод, message().

Пример

Strawberry получает всё публичное из Fruit и добавляет message():

Prompt
Создайте PHP-класс Fruit с публичными свойствами $name и $color, конструктором и методом intro(). Затем создайте класс Strawberry, который расширяет Fruit и добавляет метод message(). Создайте объект Strawberry и вызовите оба метода.
Вывод: PHP-скрипт

PHP — Наследование и модификатор доступа protected

В предыдущей главе было показано, что члены с модификатором protected доступны самому классу и производным от него классам.

С внешним кодом всё иначе: вызов оттуда метода protected заканчивается ошибкой, а методы public продолжают работать как обычно.

Пример

Здесь внешний код вызывает protected-метод intro() и получает ошибку:

Prompt
Создайте класс Fruit с защищённым методом intro() и дочерний класс Strawberry с публичным методом message(). Попробуйте вызвать intro() извне класса, чтобы показать, что это приводит к ошибке.
Вывод: PHP-скрипт

Пример

Производный класс может без проблем вызвать тот же protected-метод изнутри:

Prompt
Создайте класс Fruit с защищённым методом intro() и дочерний класс Strawberry, метод message() которого вызывает защищённый intro() изнутри производного класса.
Вывод: PHP-скрипт

PHP — Переопределение унаследованных методов

Дочерний класс может заменить унаследованный метод. Для этого достаточно определить в дочернем классе метод с тем же именем; это называется переопределением.

В следующем примере Strawberry (дочерний класс) предоставляет собственные __construct() и intro(), и они переопределяют версии из Fruit (родительского класса):

Пример

Выполняются именно те версии __construct() и intro(), которые находятся в Strawberry:

Prompt
Создайте класс Fruit с конструктором и методом intro(). Затем создайте дочерний класс Strawberry, который переопределяет и __construct(), и intro() своими реализациями, добавляя свойство $weight.
Вывод: PHP-скрипт

PHP — Ключевое слово final

Иногда класс или метод должен оставаться именно таким, каким написан. Для этого есть ключевое слово final: для класса оно запрещает наследование, а для метода — переопределение.

Пример

Класс с пометкой final нельзя расширить, поэтому этот код завершается фатальной ошибкой:

Prompt
Создайте final-класс Fruit, а затем попробуйте создать класс Strawberry, который его расширяет, — это приведёт к ошибке.
Вывод: PHP-скрипт

Пример

Метод с пометкой final нельзя переопределить в дочернем классе, поэтому этот код тоже завершается фатальной ошибкой:

Prompt
Создайте класс Fruit с final-методом intro(), затем создайте дочерний класс Strawberry, который пытается переопределить метод intro(), — это приведёт к ошибке.
Вывод: PHP-скрипт