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

Шпаргалка

Наследование позволяет классу приобретать свойства и методы другого класса с помощью ключевого слова 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()
?>
quiz iconПроверьте себя

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

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