Как вы организуете и управляете вспомогательными объектами, такими как ядро базы данных, уведомления пользователей, обработка ошибок и т.д. в объектно-ориентированном проекте на основе PHP?
Скажем, у меня большая PHP CMS. CMS состоит из различных классов. Несколько примеров:
- объект базы данных
- Управление пользователями
- API для создания / изменения / удаления элементов
- объект обмена сообщениями для отображения сообщений конечному пользователю
- обработчик контекста, который перенесет вас на нужную страницу
- класс панели навигации, который показывает кнопки
- объект регистрации
- возможно, настраиваемая обработка ошибок
и т.п.
Я имею дело с вечным вопросом, как лучше всего сделать эти объекты доступными для каждой части системы, которая в этом нуждается.
мой первый подход много лет назад заключался в том, чтобы иметь глобальный объект $ application, содержащий инициализированные экземпляры этих классов.
global $application;
$application->messageHandler->addMessage("Item successfully inserted");
Затем я переключился на шаблон Singleton и фабричную функцию:
$mh =&factory("messageHandler");
$mh->addMessage("Item successfully inserted");
но меня это тоже не устраивает. Модульные тесты и инкапсуляция становятся для меня все более и более важными, и, в моем понимании, логика глобальных / одиночных объектов разрушает основную идею ООП.
Тогда, конечно, есть возможность дать каждому объекту ряд указателей на вспомогательные объекты, которые ему нужны, вероятно, самый чистый, ресурсосберегающий и удобный для тестирования способ, но я сомневаюсь в ремонтопригодности этого в долгосрочной перспективе.
Большинство фреймворков PHP, которые я изучал, используют либо шаблон singleton, либо функции, которые обращаются к инициализированным объектам. Оба хороших подхода, но, как я уже сказал, я не доволен ни одним.
Я хотел бы расширить свой кругозор в отношении того, какие общие закономерности существуют здесь. Я ищу примеры, дополнительные идеи и указатели по направлению к ресурсам , которые обсуждают это с долгосрочной , в реальном мире точки зрения.
Кроме того, мне интересно услышать о специализированных, нишевых или просто странных подходах к этому вопросу.
$mh=&factory("messageHandler");
бессмысленно и не дает никакого преимущества в производительности. Кроме того, это устарело в версии 5.3.