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

challenge icon

Задание

Легко

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

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

  • 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). В этом и заключается сила наследования: напишите общую функциональность один раз в родительском классе и позвольте дочерним классам повторно использовать ее, добавляя свои собственные специализации.

Попробуйте сами

<?php
// Подключите класс Motorcycle (который уже включает Vehicle)
require_once 'Motorcycle.php';

// Считайте входные данные
$brand = trim(fgets(STDIN));

// TODO: Создайте объект Motorcycle с брендом

// TODO: Выведите результат start()

// TODO: Выведите результат wheelie()

// TODO: Выведите результат stop()
?>
quiz iconПроверьте себя

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

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