Основная идея внедрения зависимостей Joomla заключается в том, что разработчики больше не должны получать доступ к ключевым экземплярам класса Joomla путем вызова

$obj = new JoomlaClass();
или
$obj = JoomlaClass::getInstance();

Вместо этого они должны сделать запрос к контейнеру внедрения зависимостей (DIC):

$obj = $container( – Пожалуйста, дайте мне экземпляр JoomlaClass – );

Или получить через экземпляр класса Application или фабричный класс, который был получен из DIC.

Основная причина этого заключается в том, чтобы улучшить тестирование, упростив имитацию классов. Если код содержит несколько вызовов JoomlaClass::getInstance() тогда будет трудно издеваться над этим классом для тестирования.

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

$obj = $container( – Пожалуйста, дайте мне экземпляр класса, который реализует JoomlaInterface – );

Затем DIC вернет либо реальный класс, либо имитированный класс, в зависимости от того, как он был настроен. Однако использование имени класса в сравнении с именем интерфейса не имеет никакого отношения к функциональности; как мы увидим, ключ, используемый для ввода данных в DIC и получения данных из DIC, - это просто строка, поэтому нам просто нужно убедиться, что мы используем одну и ту же строку ключа для обеих операций.