Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про PHP: solid

Какие принципы SOLID выделяют и как работает принцип инверсии зависимостей (DIP)?

Вопрос проверяет знание пяти принципов SOLID, а также более глубокое понимание DIP как одного из ключевых архитектурных паттернов.

Короткий ответ

SOLID состоит из пяти принципов: SRP, OCP, LSP, ISP, DIP. DIP (Dependency Inversion Principle) говорит, что модули высокого уровня не должны зависеть от конкретных реализаций — только от абстракций. Это уменьшает связность и облегчает замену частей системы. DIP применяется с помощью интерфейсов и внедрения зависимостей, позволяя подменять конкретные реализации без переписывания бизнес-логики.

Длинный ответ

Принципы SOLID и DIP

SOLID — набор из пяти принципов хорошего проектирования.

1. Пять принципов SOLID

  1. SRP — Single Responsibility Principle
    Принцип единственной ответственности.
    Класс должен иметь одну причину для изменения.

  2. OCP — Open/Closed Principle
    Принцип открытости/закрытости.
    Классы должны быть открыты для расширения, но закрыты для изменения.

  3. LSP — Liskov Substitution Principle
    Принцип подстановки Барбары Лисков.
    Объекты дочерних классов должны корректно заменять объекты базовых.

  4. ISP — Interface Segregation Principle
    Принцип разделения интерфейсов.
    Лучше много маленьких интерфейсов, чем один универсальный.

  5. DIP — Dependency Inversion Principle
    Принцип инверсии зависимостей.
    Модули верхнего уровня не должны зависеть от модулей нижнего уровня — оба должны зависеть от абстракций.

2. Как работает DIP

Определение: DIP — это принцип, согласно которому бизнес-логика (верхний уровень) должна зависеть от абстракций, а не от конкретных реализаций.

Проблема без DIP:

php

class OrderService {
    private MysqlRepository $repo;

    public function __construct() {
        $this->repo = new MysqlRepository();
    }
}

Здесь OrderService жёстко привязан к MySQL.

Корректная реализация DIP

  1. Создаём абстракцию:

php

interface OrderRepository {
    public function save(Order $order): void;
}
  1. Реализуем разные репозитории:

php

class MysqlRepository implements OrderRepository { /* ... */ }
class RedisRepository implements OrderRepository { /* ... */ }
  1. Инъекция зависимости:

php

class OrderService {
    public function __construct(private OrderRepository $repo) {}

    public function process(Order $order): void {
        $this->repo->save($order);
    }
}

Теперь:

  • можно подменить хранилище

  • тестирование упрощено (моки/стабы)

  • бизнес-логика не знает о реализации

3. Как применяют DIP на практике

  • через DI-контейнеры (Symfony, Laravel)

  • через внедрение зависимостей (конструктор, сеттеры, методы)

  • через интерфейсы и абстрактные классы

  • через фабрики и компоновщики

4. Вывод

DIP — самый важный принцип SOLID для построения гибкой архитектуры: бизнес-логика зависит от абстракций, а конкретные реализации легко заменяемы.

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • PHP

    PHP

Ключевые слова

#solid

Подпишись на PHP Developer в телеграм

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.