Menu
Coddy logo textTech

Основы наследования

Часть раздела Объектно-ориентированное программирование путешествия по 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, уменьшая дублирование и упрощая сопровождение кода.

challenge icon

Задание

Легко

Давайте создадим иерархическую систему транспортных средств, которая демонстрирует, как наследование позволяет дочерним классам совместно использовать функциональность родительского класса, добавляя собственные специализированные поведения.

Вы организуете код в трёх файлах:

  • Vehicle.php: Define класс Vehicle, который выступает в роли parent для всех транспортных средств. У него должно быть public свойство $brand и constructor, который accepts и sets brand. Include method start(), возвращающий "[brand] is starting", и method stop(), возвращающий "[brand] is stopping".
  • Motorcycle.php: Define класс Motorcycle, который extends Vehicle. Include файл Vehicle в верхней части. Классу Motorcycle не нужен собственный constructor, поскольку он унаследует constructor parent. Add method wheelie(), возвращающий "[brand] is doing a wheelie!". Это поведение, уникальное для мотоциклов.
  • main.php: Include файл Motorcycle, который already включает Vehicle. Вы получите один input: марку мотоцикла. Create object Motorcycle с этой маркой. 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()
?>
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор PHP