Сингелтон и настройки конфигурации

Духовность™

Продвинутый новичок
Сингелтон и настройки конфигурации

По моему, я даже этот вопрос уже задавал.. не помню.

В любой системе есть что-то типа файла config.php, где прячутся всякие настройки системы (например, пути до системных директорий). И иногда эти настройки системы надо знать в вызываемых функциях или классах. Сразу напрашивается сингелтон, НО что непонятно - как в сингелтон эти настройки передавать? Т.е. есть два пути решения:

1. Мы объявляем переменные конфигурации в глобальной области видимости, например, в массиве $_CONFIG и делаем потом $mySingelton::import($_CONFIG)

или

2. Непосредственно в сингелтоне определяем все необходиме настройки.

Чем плох второй вариант - придется для доступа к каждой переменой делать $mySingelton::getVar('var_name')

Чем плох первый вариант - дублирование переменных и забивание памяти ими.

Как поступить?
 

Balloon

Новичок
у мя тож есть немного вариантов:
1. сделать $_CONFIG глабальным, что проще всего наверное
или
2. сделать статический класс Config и для конфигурации использовать его

класс примерно так будет выглядеть:
class Config {
static var $config;
static function add($section, $param, $value);
static function get($section, $param);
}

зы. в пхп5 есть магический методы __get и __set , с помощью которых можно не писать $mySingelton::getVar('var_name'), а юзать $mySingelton::var_name
 

kode

never knows best
дваждую предыдущего оратора

config.php


Config::set('template_dir', dirname(__FILE__).'/templates');
Config::set('db_type', 'PDO_MySQL');

$config = array(
'db_host'=>'localhost',
'db_user'=>'root',
//....
);

Config::set($config);



index.php


$db = DBFactory(Config::get('db_type'));

$db->connect(Config::get('db_host');
//.....


Можно получать через Registry сделать, те $config = Registry::get('config'); $config->get('db_host');......
 

Духовность™

Продвинутый новичок
kode
т.е. ты предлагаешь вместо

PHP:
class Config {
static var $config;
static function add($section, $param, $value);
static function get($section, $param);
}
делать

PHP:
Config::set('template_dir', dirname(__FILE__).'/templates');
Config::set('db_type', 'PDO_MySQL');
разницы не много, но всетаки, что из этого более правильно?
 

Alexandre

PHPПенсионер
1) для настроек я использую константы:
PHP:
define('HTTP_IMG_PATH',$dir.'/htdocs/img/');
define('TEMPLATE_DIR',$dir.'/template/');
define('CLASS_DIR',$dir.'/classes/');
2) хочешь делать через синглетон, тогда у тебя должно быть что=-то типа:
PHP:
$config = Config::getInstance();
$img_path = $config->getImagePath();
3)если параметры как-то меняются (настраиваются), то полс. строчак может быть:
PHP:
$img_path = $config->getParam('ImagePath');
4)можно все это запихнуть в статический класс, тогда и не нужен будет синглетон:
PHP:
getParam('ImagePath')::config;
На вкус и цвет - любителей пива нет
 

С.

Продвинутый новичок
Alexandre, в настройках очень часто не только скаляры нужны.
 

Духовность™

Продвинутый новичок
2) хочешь делать через синглетон, тогда у тебя должно быть что=-то типа:
В сам сингелтон пихать все это ИМХО смысла нет, достаточно наверно просто сделать класс с набором статических переменных и инициализировать экземпляр этого класса непосредственно из сингелтона..
 

Alexandre

PHPПенсионер
я использую два типа настроек - это константы, которые определяют диры и как правило от платформы независимы (структура проекта всегда одинакова и не зависит от типа машины - девелопер, продакшен и тд ) и xml конфиг, который хранит прочую чушь, типа виды алгоритмов, пункты меню, размер превьюшек и тд. данный конфиг я забираю simpleXML и присваиваю его при иннициализации класса Application полю класса config. По этому, данные конфига доступны всем классам, которые иннициализируются в Application :)

-~{}~ 11.07.08 11:12:

настройках очень часто не только скаляры нужны.
а кто тебе мешает вернуть массив : $img_path = $config->getParam('ImageSize');

-~{}~ 11.07.08 11:16:

данный конфиг я забираю simpleXML и присваиваю его при иннициализации класса Application
Да, если хотите HiLoad, то данный конфиг из xml преобразую в код php массива каждый раз при записи конфига (через админку или через спец скрипт, что впрочем все равно), и класс Application уже использует массив, что гораздо быстрее нежели парсить каждый раз XML. Ну а при большем желании - данные конфига можно положить в кеш памяти.
 
Сверху