Основы наследования
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 21 из 91.
Наследование позволяет классу приобретать свойства и методы другого класса. Вместо того чтобы переписывать один и тот же код, вы можете создать базовый класс с общим функционалом и сделать так, чтобы другие классы наследовались от него.
Класс, от которого происходит наследование, называется родительским классом (или базовым классом), а класс, который наследует, называется дочерним классом. Для установления этой связи используется ключевое слово extends:
<?php
class Animal {
public $name;
public function __construct($name) {
this->name = $name;
}
public function speak() {
return "$this->name makes a sound";
}
}
class Dog extends Animal {
public function fetch() {
return "$this->name fetches the ball";
}
}
$dog = new Dog("Buddy");
echo $dog->speak() . "\n";
echo $dog->fetch();
Вывод:
Buddy makes a sound
Buddy fetches the ballКласс Dog автоматически имеет доступ к свойству $name, конструктору и методу speak() из Animal. Он также определяет собственный метод fetch(), который есть только у собак.
Это создает четкую иерархию: каждая собака — это животное, поэтому логично, чтобы Dog наследовался от Animal. Дочерний класс может использовать все возможности родительского, добавляя при этом свое собственное специализированное поведение.
Ключевой момент: Наследование способствует повторному использованию кода и устанавливает логические связи между классами. Дочерний класс наследует все public и protected члены от родительского, что сокращает дублирование и упрощает поддержку кода.
Задание
ЛегкоДавайте создадим иерархическую систему транспортных средств, которая демонстрирует, как наследование позволяет дочерним классам использовать функциональность родительского класса, добавляя при этом свое собственное специализированное поведение.
Вы организуете свой код в трех файлах:
Vehicle.php— Определите классVehicle, который будет служить родительским для всех транспортных средств. Он должен иметь публичное свойство$brandи конструктор, который принимает и устанавливает бренд. Включите методstart(), который возвращает"[brand] is starting", и методstop(), который возвращает"[brand] is stopping".Motorcycle.php— Определите классMotorcycle, который расширяетVehicle. Подключите файл Vehicle в начале. Классу Motorcycle не нужен собственный конструктор, так как он унаследует конструктор родителя. Добавьте методwheelie(), который возвращает"[brand] is doing a wheelie!"— это поведение, уникальное для мотоциклов.main.php— Подключите файл Motorcycle (который уже включает Vehicle). Вы получите один входной параметр: марку мотоцикла. Создайте объектMotorcycleс этой маркой. Выведите результат вызоваstart(), затемwheelie(), а затемstop(), каждый на новой строке.
Обратите внимание, как класс Motorcycle автоматически наследует свойство $brand, конструктор и оба метода start() и stop() от Vehicle. Дочернему классу нужно только определить то, что делает его уникальным — в данном случае, способность делать "wheelie". В этом и заключается сила наследования: напишите общую функциональность один раз в родительском классе и позвольте дочерним классам повторно использовать ее, добавляя свои собственные специализации.
Шпаргалка
Наследование позволяет классу приобретать свойства и методы другого класса с помощью ключевого слова extends. Класс, от которого происходит наследование, называется родительским классом (или базовым классом), а класс, который наследует, называется дочерним классом.
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
return "$this->name makes a sound";
}
}
class Dog extends Animal {
public function fetch() {
return "$this->name fetches the ball";
}
}
$dog = new Dog("Buddy");
echo $dog->speak(); // Buddy makes a sound
echo $dog->fetch(); // Buddy fetches the ball
Дочерний класс наследует все публичные и защищенные члены родительского класса, включая свойства, конструкторы и методы. Дочерний класс также может добавлять свои собственные специализированные методы и свойства.
Наследование способствует повторному использованию кода и устанавливает логические связи между классами, уменьшая дублирование и облегчая поддержку кода.
Попробуйте сами
<?php
// Подключите класс Motorcycle (который уже включает Vehicle)
require_once 'Motorcycle.php';
// Чтение входных данных
$brand = trim(fgets(STDIN));
// TODO: Создайте объект Motorcycle с указанием бренда
// TODO: Выведите результат выполнения start()
// TODO: Выведите результат выполнения wheelie()
// TODO: Выведите результат выполнения stop()
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy