Что такое наследование в ООП?

«Что такое наследование в ООП?» — вопрос из категории ООП, который задают на 38% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Наследование — это механизм ООП, который позволяет создавать новый класс (дочерний, производный) на основе уже существующего класса (родительского, базового). Дочерний класс автоматически получает (наследует) все публичные и защищённые свойства и методы родительского класса, а также может:

  • Добавлять новые свойства и методы.
  • Переопределять унаследованные методы, изменяя их поведение.

Основная цель: повторное использование кода (DRY — Don't Repeat Yourself) и создание иерархии классов, отражающей логические отношения "является" (is-a).

Пример на PHP:

// Базовый (родительский) класс
class Vehicle {
    protected string $brand;

    public function __construct(string $brand) {
        $this->brand = $brand;
    }

    public function startEngine(): string {
        return "Двигатель транспортного средства {$this->brand} запущен.";
    }
}

// Дочерний класс. Car *является* Vehicle.
class Car extends Vehicle {
    private bool $isConvertible = false;

    // Переопределение метода родителя
    public function startEngine(): string {
        return "Автомобиль {$this->brand} завёлся с характерным рычанием!";
    }

    // Новый метод, специфичный для Car
    public function openRoof(): void {
        if ($this->isConvertible) {
            echo "Крыша открыта!";
        }
    }
}

// Другой дочерний класс
class Bicycle extends Vehicle {
    // Переопределение с вызовом родительской логики и дополнением
    public function startEngine(): string {
        // У велосипеда нет двигателя, поэтому базовое поведение не подходит.
        return "У велосипеда {$this->brand} нет двигателя. Крутите педали!";
    }
}

// Использование
$myCar = new Car('Toyota');
echo $myCar->startEngine(); // "Автомобиль Toyota завёлся с характерным рычанием!"

$myBike = new Bicycle('Stels');
echo $myBike->startEngine(); // "У велосипеда Stels нет двигателя. Крутите педали!"

Важные нюансы в PHP:

  • Поддерживается одиночное наследование (класс может наследовать только от одного родителя).
  • Для обращения к методу родительского класса из переопределённого метода используется ключевое слово parent:: (например, parent::startEngine()).
  • Модификатор доступа private в родительском классе означает, что свойство или метод не наследуются и не видны в дочернем классе.
  • Класс, объявленный как final, не может быть унаследован.

Видео-ответы