Основы наследования
Часть раздела Объектно-ориентированное программирование путешествия по 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 члены от parent, уменьшая дублирование и упрощая сопровождение кода.
Задание
ЛегкоДавайте создадим иерархическую систему транспортных средств, которая демонстрирует, как наследование позволяет дочерним классам совместно использовать функциональность родительского класса, добавляя собственные специализированные поведения.
Вы организуете код в трёх файлах:
Vehicle.php: Define классVehicle, который выступает в роли parent для всех транспортных средств. У него должно быть public свойство$brandи constructor, который accepts и sets brand. Include methodstart(), возвращающий"[brand] is starting", и methodstop(), возвращающий"[brand] is stopping".Motorcycle.php: Define классMotorcycle, который extendsVehicle. Include файл Vehicle в верхней части. Классу Motorcycle не нужен собственный constructor, поскольку он унаследует constructor parent. Add methodwheelie(), возвращающий"[brand] is doing a wheelie!". Это поведение, уникальное для мотоциклов.main.php: Include файл Motorcycle, который already включает Vehicle. Вы получите один input: марку мотоцикла. Create objectMotorcycleс этой маркой. Print result вызоваstart(), затемwheelie(), затемstop(), каждый на отдельной строке.
Обратите внимание, как класс Motorcycle автоматически inherits свойство $brand, constructor и оба method — start() и stop() — от Vehicle. Дочернему классу нужно Define только то, что делает его уникальным, в данном случае — возможность выполнять wheelie. В этом заключается сила наследования: один раз написать общую функциональность в parent и позволить дочерним классам повторно использовать её, добавляя собственные специализации.
Попробуйте сами
<?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Модификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP