Кое-что из этого придет по вкусу. На работе мы также получаем дескриптор подключения ADODB через
$db = Registry :: getDB();
Аналогично, вы можете записать часть этого кода, используя цепочку методов:
$name = Registry :: getDB()->getOne(
"SELECT name FROM user WHERE user_id = ?", $userId
);
Использование реестра означает, что ваш вызывающий код имеет конкретную зависимость от вашего Registry
класса. Это затрудняет тестирование вашего кода (лично я единственный раз, когда я ударился головой о стену с помощью реестра) .
Если вы хотите добавить модульные тесты для своего кода, вам часто нужно смоделировать соединение с базой данных, чтобы не манипулировать базой данных каждый раз при запуске набора тестов.
Вы все еще можете обойти это, изучив свою работающую среду и сконфигурировав свой реестр с помощью фиктивного класса абстракции базы данных, но это не так элегантно, как внедрение зависимостей (DI).
Лучшее объяснение DI и контейнеров (для разработчика PHP), которое я видел, это Внедрение зависимостей Фабьена Потенциера с PHP 5.3 (начиная со слайда 9).
Вы передаете контейнер DI вместо Реестра, он предоставляет элегантный и простой способ получить указатели на зависимости (например, Реестр), но является гибким и более свободным, поэтому вы можете при необходимости смоделировать эти зависимости.