Как указал Виккен в комментарии к вашему вопросу, вы представляете Global State для своего приложения. Цитируя Мартина Фаулера о глобальном состоянии (PoEAA, стр. 482f):
Помните, что любые глобальные данные всегда виновны, пока не доказано невиновность.
что в двух словах означает: избегайте этого. Я предоставляю вам право исследовать эту тему, потому что этот вопрос выходит за рамки для подробного обсуждения.
Теперь для лучшей альтернативы
Предположим, вы перенаправили весь трафик на index.php. Затем вы можете просто загрузить / собрать все компоненты, необходимые для выполнения запроса внутри этого файла. Например, вот так:
spl_autoload_register(
function($className) {
static $classMap = array(
'request' => '/path/from/here/to/Request.php',
… more mapping
);
require __DIR__ . $classMap[strtolower($className)];
}
);
$config = parse_ini_file(__DIR__ . '/path/from/here/to/config.ini');
foreach($config['env'] as $key => $val) {
ini_set($key, $val);
}
$router = new Router;
$router->registerActionForRoute(
'/product/list',
function($request, $response) use ($config) {
return new ProductListAction(
$request, $response
new ProductMapper(
new ProductGateway(
new MySqli($config['db']['host'], …),
new Cache($config['cache'], …)
),
new ProductBuilder;
)
);
}
);
$router->registerActionForRoute(…);
$router->execute(new Request($_GET, $_POST, $_SERVER), new Response);
Конечно, вы скорее хотите включить автозагрузчик из отдельного файла (потому что вы хотите автоматически сгенерировать его с чем-то вроде https://github.com/theseer/Autoload). И, конечно, вы можете заменить замыкания в маршрутизаторе на Builder или фабричные паттерны. Я просто использовал простейшую возможную вещь . Это (надеюсь) легче понять таким образом. Вы можете проверить http://silex -project.org / для микро- фреймворк с использованием более сложного, но схожего подхода.
Основным преимуществом этого подхода является то, что каждый компонент с самого начала получает то, что ему нужно, через Внедрение зависимости . Это облегчит модульное тестирование вашего кода, потому что намного проще смоделировать зависимости и добиться изоляции тестов.
Еще одним преимуществом является то, что вы разделяете граф построения и график сотрудничества, поэтому вы не путаете эти ответственность (как вы бы сделали с Singleton или иным образом добавив ключевое слово new
в классы, которые должны быть информационными экспертами.