За последние 24 часа нас посетили 19093 программиста и 1683 робота. Сейчас ищут 850 программистов ...

Как работать с конфигурационными настройками в программе?

Тема в разделе "Прочие вопросы по PHP", создана пользователем start2dev, 16 июл 2010.

  1. start2dev

    start2dev Активный пользователь

    С нами с:
    16 июл 2010
    Сообщения:
    3
    Симпатии:
    0
    Сейчас для себя делаю один скрипт. В нем присутствует файл настроек (json). Возник вопрос: как работать с настройками, например, в функциях?
    Вижу несколько выходов:
    1. Глобальный массив $config. В функциях писать global $config или обращаться через $GLOBALS.
    2. Класс и статические переменные. В функциях ничего не надо дополнительно писать, сразу обращаться к конфигу через config::$param.
    3. Константы. Ну это не подходит, так как информация может меняться (конфиг) в процессе работы.
    4. Функция, возвращающая конфиг. У функций, вроде, глобальная область видимости, если они не описаны внутри класса.

    Как вы считаете, какой вариант лучший?
     
  2. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    а чем константы не подходят ? их нельзя менять, но можно ведь присвоить значение в переменную и делать с ней все что надо, что у вас там в файле настроек?Вообще конечно интересно что у вас там такое, что нужно менять ...
     
  3. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    какой-то объект, который будет передаваться по цепочки в контроллеры/виджеты/блоки и из которого можно будет получить любой сервис и настройки для него. Ну или на худой конец статический класс, который будет делать то же самое
     
  4. start2dev

    start2dev Активный пользователь

    С нами с:
    16 июл 2010
    Сообщения:
    3
    Симпатии:
    0
    эм, ну вообще-то
    PHP:
    1. <?php
    2. $thing = 4221;
    3. define('THING', $thing);
    4. $thing = 'test';
    5. echo THING; ?>
    данный код выведет именно 4221. Так что не подходит. Константы на то и константы, чтобы иметь всегда одно и то же значение.
    Пример вещицы из файла настроек: id приложения, может меняться по get-запросу (а-ля ?app_id=45192).
    и это id приложения используется почти во всех функциях.
     
  5. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    start2dev
    я не это написал и не это имелл ввиду, почему не передавать ваш массив в конструктор класса?
     
  6. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Аллах.
    Для этого придуман шаблон реестр (Registry). Это типичный синглтон.
    Класс регистрируется при создании экземпляра приложения и хранит в себе настройки.
    Из любого места программы можно обращаться к данным этого класса.
    Например:

    PHP:
    1. <?php
    2.  
    3. $config = Registry::getInstance()->config;
     
  7. start2dev

    start2dev Активный пользователь

    С нами с:
    16 июл 2010
    Сообщения:
    3
    Симпатии:
    0
    Большое спасибо! Ушел читать статьи про Registry.
     
  8. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    бл я, шаблоны шаблонами, объекты объектами, смотря что делается и где - и регистр может быть вообще не уместным решением...
     
  9. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    классический реестр плох тем, что он не поддерживает ленивой загрузки
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Вообще хорошо бы подумать над системой связей. Чтобы подгружать что надо централизовано. Контроллеры при загрузке делают записи в реестр. С другой стороны, обращение к ветке контроллера в реестре приводит к подгрузке контроллера.
     
  11. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Поясни, а? =)
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    ну это приминительно конкретно к реестру. Когда нам надо получить из него какую-нибудь информацию, которую в него обычно записывает другой контроллер во время инициализации. Мы ее запрашиваем (обращаясь к ветке ресстра с именем нужного контроллера), контроллер подгружается и инициализируется, записывая в реестр нужные данные. Конечно, не нужно при инициализации реестра создавать в нем ветки для каждого контроллера - надо при обращении к несуществующей ветки проверять наличие контроллера и создавать ее.
     
  13. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    вот я о чём и говорю, у меня вообще контроллеры в никакие реестры ничего не записывают, так что всё зависит от всего
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    Re: Как работать с конфигурационными настройками в программе

    ужас-ужас
    я делаю таки config::get() и config::set() хотябы для того, чтобы избежать бесконечных
    PHP:
    1. $value = isset(config::$param['key']) ? config::$param['key'] : NULL;
    у меня это завернуто в get()
    плюс оставляет возможность для развития, например можно придумать реализацию своего session/flash variables через по тому же принципу
    правильно - может меняться в run-time и конфиги имеют свойство распухать. не напасёшся на него констант :)
    если у тебя всё в процедурном стиле, то почему бы нет. а смешивать классы и функции как-то непоследовательно.
    imho, реестр через класс со статическими методами.
    не надо заниматься самообманом а-ля config::getInstance() - в данном случае это онанизм, безвредный, но бесполезный.
     
  15. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    +1
     
  16. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    та не, сам часто юзаю :)

    дрочить на опп имхо не всегда выгодно, иногда "по-быстренькому" удобнее)
     
  17. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    я не спорю. когда надо что-то наскоро проверить или сконвертировать разово - нормально. а ТС планирует какую-то серьезную систему с настоящим конфигом. при таких раскладах глобалы это запрограммированная головная боль.
     
  18. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    artoodetoo
    а гуть круть ты папо мой кумир =)
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    artoodetoo
    кроме шуток, започем состряпаешь/спроектируешь систему юзерконфиг<->БД если заранее не известны параметры, которые хранить?
     
  20. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    igordata
    это же обыкновенный EAV, все уже до нас спроектировано
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    хто такой этот ваш еав?
     
  22. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    гугли, хуле
     
  23. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    Кос прав
     
  24. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    Конфиги с неопределённым набором полей в БД можно представить как минимум двумя способами — либо как сериализованный массив в одном BLOB, либо как таблица имя-значение
    [sql]create table config(fieldname varchar(80), fieldvalue text);[/sql]
    Вычитываем с базы, фигачим в реестр.
    Эффективнее иметь кеш (файловый) в котором будет слепок текущего состояния этой таблицы. При изменении таблицы кеш сбрасываем.
     
  25. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    Если конфиг привязан к конкретной сущности, например пользователю, то усложняем схему еще одним полем:
    [sql]create table config(userid int, fieldname varchar(80), fieldvalue text)[/sql]
    это кагбе eav