> Что такое принцип подстановки Лисков из SOLID? (PHP)

Уровень: junior · Язык: PHP · Категория: Технические вопросы

Компании: Travelata

> Пример ответа

Принцип подстановки Лисков (Liskov Substitution Principle, LSP) гласит: объекты в программе должны быть заменяемы экземплярами их подтипов без изменения корректности программы. Проще говоря, если у вас есть класс-родитель, то его наследники должны полностью соответствовать контракту родителя, не нарушая ожидаемого поведения.

В PHP это означает, что при наследовании нельзя:

  • Сужать предусловия (например, требовать более строгие типы аргументов, чем в родителе).
  • Расширять постусловия (например, возвращать более широкий тип или выбрасывать новые исключения, не предусмотренные родителем).
  • Нарушать инварианты (например, изменять внутреннее состояние так, чтобы методы родителя перестали работать корректно).

Пример нарушения LSP:

PHP
class Rectangle {
protected int $width;
protected int $height;
public function setWidth(int $w): void { $this->width = $w; }
public function setHeight(int $h): void { $this->height = $h; }
public function getArea(): int { return $this->width * $this->height; }
}
class Square extends Rectangle {
public function setWidth(int $w): void {
$this->width = $w;
$this->height = $w; // нарушение: меняет поведение родителя
}
public function setHeight(int $h): void {
$this->height = $h;
$this->width = $h; // то же самое
}
}
function printArea(Rectangle $rect): void {
$rect->setWidth(5);
$rect->setHeight(10);
echo $rect->getArea(); // ожидается 50, но для Square будет 100
}

Здесь Square не может заменить Rectangle без ошибок, так как нарушает контракт. Правильное решение - не наследовать Square от Rectangle, а использовать общий интерфейс или композицию.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью