Внедрение зависимости (англ. Dependency injection, DI) — это процесс предоставления внешней зависимости программному компоненту.

Внедрение зависимостей разъединяет код от других, специфических, классов. При правильном использовании, внедрение зависимостей позволяет легко заменить зависимость ложным классом во время тестирования, или заменить зависимость совершенно другим классом, который выполняет поставленную задачу лучше. 

Если говорить коротко, то внедрение зависимостей делает код более устойчивым к изменениям и более переносимым. 

Предположим, что у вас имеется модель для управления учетными данными пользователей. Естественно необходим класс базы данных для работы с данным. Без внедрения зависимостей можно было сделать, например, вот так:
 

class UserModel
{
    protected $db;

    public function __construct()
    {
        $this->db = new Database();
    }
}

Но здесь появляется проблема. Если вам когда-нибудь нужно будет использовать другую библиотеку базы данных или переключиться с MySQL на MongoDB, то придется изменить код в каждом классе. Если вы запускаете тесты, вы никогда не сможете отделить логику в вашей модели из класса Database. Это не очень удобно. Поэтому, чтобы исправить это, следующим шагом является передача класса базы данных в конструктор, в качестве зависимости. 

class UserModel
{
    protected $db;

    public function __construct(DatabaseInterface $db)
    {
        $this->db = $db;
    }
}

Это самая чистая форма внедрения зависимостей. Любые внешние классы, вводятся или через конструктор, либо или через метод установки.
В основе CodeIgniter 4, конструктор на основе DI используется повсеместно. Теперь нет больше необходимости использовать MY_ файлы для расширения или замены функционала. Поэтому можно создать новый класс, который соответствует интерфейсу.

Использование внедрения зависимостей в приложениях не требуется, хотя это рекомендуется. Сама структура использует эти файлы, и они обеспечивают простой способ изменить ядро фреймворка.

Предположим, что вы должны получить всех активных пользователей. Чтобы получить новый экземпляр модели, необходимо будет сделать что-то вроде этого:

class Users extends \CodeIgniter\Controller
{
    public function index()
    {
        $model = new UserModel( Config\Services::database() );

        $data = [
            'users' => $model->findAll()
        ];

        echo view('users/list_all', $data);
    }
}

Весь показанный материал приведен в качестве примера, и не отражает полностью окончательный функционал фреймворка каким-либо образом!

Ссылки по теме:

Блог Лонни Эцелла: Dependency Injection in CodeIgniter 4
Wikipedia: Внедрение зависимости
CodeIgniter Wikipedia: ru.wikipedia.org/wiki/CodeIgniter
Официальный сайт CodeIgniter: www.codeigniter.com
Официальный форум CodeIgniter: forum.codeigniter.com