DI — паттерн, при котором зависимости класса передаются извне, а не создаются внутри.
// Плохо — жёсткая связанность: class OrderService { private $mailer; public function __construct() { $this->mailer = new SmtpMailer(); // зависимость зашита внутри } }
// Хорошо — DI: class OrderService { public function __construct(private MailerInterface $mailer) {} }
Зачем:
✔️ Легко подменить реализацию (например, для тестов — MockMailer) ✔️ Классы не знают о конкретных реализациях (зависимость от абстракции) ✔️ Код легче тестировать, поддерживать, расширять
DI Container (Symfony, Laravel) автоматизирует создание объектов и внедрение зависимостей по всему приложению.