Инъекция зависимостей, это когда ты не жёстко в коде прописываешь то что один компонент использует другой, а передаёшь один компонент другому.
Конкретно:
// без DI
class Application{
private $database;
public function start(){
$this->database=new Database("localhost","user","pass");
//....
}
}
$application = new Application();
$application->start();
// с DI
class Application{
private $database;
public fucnction __construct(Database $d){
$this->database=$d;
}
public function start(){
//....
}
}
$application = new Application(new Database("localhost","user","pass"););
$application->start()
Таким образом создание большинства компонентов сосредотачивается в одном месте - там где запускается приложение.
Зачем?
Во первых удобно контролировать. Если мы захотим использовать вместо Database другой класс для работы с БД, мы знаем где и что поменять.
Во вторых удобно тестировать, это вытекает из первого - для юнит тестирования нам наверняка понадобится вместо Database использовать Mock объект. Ну и лёгкость замены компонента нам только на руку.