В общем есть массив конфигурации приложения:
$config = [
'logotext' => 'USER Application Name',
'base_dir' => BASE_DIR,
'db' => [
'file' => BASE_DIR . 'db/database.sqlite',
],
'router'=> [
'path'=>true,
'action'=>'index',
'rules'=> [],
],
];
// Старт приложения:
$app = new Application($config);
echo $app->run();
Абстрактный класс приложения - System:
abstract class System {
public $config;
public function __construct($config=null)
{
$this->_setConfig($config); // Преобразую Массив конфига в обьекты, чисто для красоты ($this->config->paramName->subParamName)
$this->init();
}
private function _setConfig($config)
{
$this->config = $this->_toObject($config);
}
public function router($class='Router')
{
return new $class($this->config->router);
}
}
Основной класс приложения Application наследуемый от абстрактного класса System:
class Application extends System {
function __construct($config=null)
{
parent::__construct($config);
}
}
Конечно я вообще не знаю точно на сколько это все правильно реализовано, не ругайте сильно. Проблема в том что каждый раз приходится передавать конфигурацию ($this->config) при создании экземпляров вспомогательных классов внутри основного класса Application или в System (через конструктор), которые тоже хотят пользоваться общим конфигурационным массивом. Например, сделаю новый класс Data, который, допустим, будет по типу модели, этому классу понадобится информация каким образом получить доступ к БД
class Data {
function getConfigDSNString()
{
return; // Вернуть какую либо строку из конфигурации в качестве примера передачи конфиг массива в класс
}
}
Как вариант конечно можно использовать отдельный для этого класс Config, в котором объявить какой-либо статический метод get() и вызывать что-то вроде Config::get('dbDSN');
Какие есть еще варианты что-бы не привязывать классы к передаче конфигурации через конструкторы или через доп статик класс Конфиг?