— Пользуйтесь константой DIRECTORY_SEPARATOR.
— Глобальные переменные это печально, они нарушают паттерны проектирования, создавая костыли, я из использую исключительно для прикручивания временного костыля, потому что вот прижало, но надо сделать, потом рефакторю через паттерны.
— Db::initDb — а зачем в этом случае пользоваться фабрикой??? Мы же объект создаем, то есть должно быть new DB(); чисто по идее ООП. И кстати, если нет совершенно особой функциональности у ваших классов, то не надо вообще оборачивать стандартные функции. У меня например класс базы данных абстрагирует физические подключения к СУБД, и переключения между БД в одной СУБД. К нему обращаются разные объекты указывая лишь название «шлюза» (я так это назвал), а класс уже гарантирует что запрос будет произведен по нужной СУБД + БД. Еще раз в вашем случае не вижу смысла использовать фабрику (у меня испольуется фабрика, что бы просто создавать объекты с вшитым «шлюзом»).
Советую делать так вначале инициализации:
// директория с системой
define('DIR_ROOT', __DIR__.DIRECTORY_SEPARATOR); // корень ядра.
// директория с кодом движка
define('DIR_CORE', DIR_ROOT.'core'.DIRECTORY_SEPARATOR);
// директория с интерфейсами движка
define('DIR_CORE_INTERFACES', DIR_CORE.'interfaces'.DIRECTORY_SEPARATOR);
========
я могу тут целый пост по моей культуре производства писать, но пожалейте меня ;-) надеюсь помог.
// директория с исключениями движка
define('DIR_CORE_EXCEPTIONS', DIR_CORE.'exceptions'.DIRECTORY_SEPARATOR);
// директория с абстрактными модулями движка
define('DIR_CORE_ABSTRACT', DIR_CORE.'abstract-modules'.DIRECTORY_SEPARATOR);