Я недавно обновил свой фреймворк при подготовке ко второй версии CMS нашей компании. Я отменил огромное количество вещей, которые я сделал статичными, чтобы заменить их обычными объектами. При этом я создал огромную гибкость, которая позволяла мне проходить и взламывать основные файлы. Сейчас я использую статические конструкции только тогда, когда единственной альтернативой являются глобальные функции, которые связаны только с низкоуровневой функциональностью ядра.
Я собираюсь показать несколько строк моего файла bootstrap.php (все мои запросы отправляются через этот файл, но вы можете достичь того же результата, включив его в начало каждого файла), чтобы показать вам, что Я имею в виду. Это довольно здоровенная версия того, что вы, вероятно, использовали бы в своей ситуации, но, надеюсь, идея полезна. (Это все немного модифицировано.)
//bootstrap.php
...
// CONSTRUCT APPLICATION
{
$Database = new Databases\Mysql(
Constant::get('DATABASE_HOST'),
Constant::get('DATABASE_USER'),
Constant::get('DATABASE_PASSWORD'),
Constant::get('DATABASE_SCHEMA')
);
$Registry = new Collections\Registry;
$Loader = new Loaders\Base;
$Debugger = new Debuggers\Dummy; // Debuggers\Console to log debugging info to JavaScript console
$Application = new Applications\Base($Database, $Registry, $Loader, $Debugger);
}
...
Как видите, у меня есть всевозможные варианты создания объекта приложения, которые я могу предоставить в качестве аргумента в конструкторе другим объектам, чтобы дать им доступ к этим "глобальным" потребностям.
Объект базы данных не требует пояснений. Объект реестра действует как контейнер для объекта, к которому я могу обратиться в другом месте приложения. Загрузчик действует как утилита для загрузки других ресурсов, таких как файлы шаблонов. И отладчик для обработки вывода отладки.
Я могу, например, изменить класс базы данных, который я создаю, и, вуаля, у меня есть соединение с базой данных SQLite. Я могу изменить класс отладчика (как было отмечено), и теперь вся моя информация об отладке будет записываться в мою консоль JavaScript.
Хорошо, теперь вернемся к вопросу. Как вы даете другим объектам доступ ко всему этому? Вы просто передаете это в качестве аргумента конструктору.
// still bootstrap.php
...
// DISPATCH APPLICATION
{
$Router = new Routers\Http($Application);
$Router->routeUri($_SERVER['REQUEST_URI']);
}
...
Не только это, но мой Маршрутизатор (или любой другой объект, который я создаю с его помощью) также более гибок. Теперь я могу просто создать экземпляр объекта приложения по-другому, и мой маршрутизатор будет вести себя соответственно по-другому.