Проектирование библиотеки как синглтона - это зло. Единственность экземпляра объекта - это характеристика конкретного дизайна приложения, а не библиотеки самой по себе. No exceptions, я на любой пример приведу контрпример, когда нужно несколько инстансов.
Потому синглтон и называют антипаттерном. При этом, в синглтоне вида
PHP:
function db() {
static $instance = null;
if (!$instance) $instance = new mysqli(...);
return $instance;
}
такого недостатка нет.
Но поскольку
1) такие функции писать лениво
2) хочется еще и управлять зависимостями (в приведенном выше примере, очевидно, вместо "..." будет обращение к конфигу)
и разрабатываются те или иные способы dependency management.
И, да, global $db - это частный случай глобальной зависимости (выраженной через глобальную переменную), в этом нет ничего плохого, если в приложении гарантированно нужно только одно соединение, и присваивание переменной инстанса объекта делается один раз. Здесь больше проблема контроля - если в любой DI/SL/registry/синглтон можно запретить переопределение элементано поставить debug_backtrace, то переопределение глобальной переменной отловить заметно сложнее. Но это не так важно (решается банальной дисциплиной), как вопрос зависимостей, почему-то все забывают про это.