Что такое DI инъекция зависимостей?
Инъекция зависимостей, это когда ты не жёстко в коде прописываешь то что один компонент использует другой, а передаёшь один компонент другому.
Конкретно:// без 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 объект. Ну и лёгкость замены компонента нам только на руку.
DI это очень круто, сам на прошлой неделе его 1-й раз реализовал в своем проекте. Теперь с зависимостями работать одно удовольствие, ну  и да - в тестах мокать зависимости удобно.