Конфиги в формате PHP

В одной из наших программ конфигурация находится в файле config.php в таком формате:

PHP:
  1. <?
  2. $param1 = 24*3600;
  3. $param2 = array(
  4.     'test' => array(1,2,3),
  5.     'test2' => cos(30)
  6. );

Этот конфиг правится только умными людьми, которые знают PHP и не нужно создавать для них лишние уровни абстракций.

Задача - загрузить этот конфиг в программу. Просто сделать include('config.php') нельзя, потому что можно нечаянно перезаписать какую-то переменную, а в конфигурационном файле писать $config['param1'], $config['param2'] слишком долго.

PHP:
  1. class TestConfigLoader {
  2.     public $config;
  3.    
  4.     function loadConfig() {
  5.         // make $temp defined var
  6.         $temp = null;
  7.        
  8.         // get list of currently defined vars
  9.         $temp = array_keys(get_defined_vars());
  10.        
  11.         // load new vars
  12.         include('config.php');
  13.        
  14.         // get list of new vars
  15.         $vars = array_diff(array_keys(get_defined_vars()), $temp);
  16.        
  17.         // save new vars to $this->config
  18.         $this->config = array();
  19.         foreach ($vars as $var) {
  20.             $this->config[$var] = $$var;
  21.         }
  22.     }
  23. }

Идея в том, чтобы посмотреть, какие переменные добавились и добавить их в $this->config этого класса.

Как это работает:

PHP:
  1. $test = new TestConfigLoader();
  2. $test->loadConfig();
  3. print_r($test);

выведет

PHP:
  1. TestConfigLoader Object
  2. (
  3.     [config] => Array
  4.         (
  5.             [param1] => 86400
  6.             [param2] => Array
  7.                 (
  8.                     [test] => Array
  9.                         (
  10.                             [0] => 1
  11.                             [1] => 2
  12.                             [2] => 3
  13.                         )
  14.  
  15.                     [test2] => 0.15425144988758
  16.                 )
  17.         )
  18. )

UPDATE 29 Aug 2008: Оказывается, в CakePHP это ещё проще - http://www.debuggable.com/posts/4-cakephp-tricks:4811ad82-32dc-4a38-bc10-36304834cda3


Понравилось?

  1. Подпишись через RSS
  2. Расскажи о http://php.southpark.com.ua друзьям.
    Все способы хороши: ICQ, E-mail, свой блог, комментарий в чужом блоге или сообщение на форуме
  3. Добавь статью на news2.ru, Хабрахабр или в закладки

Огромное спасибо!

И не стесняйтесь комментировать - у меня стоит плагин, который убирает rel="nofollow" у людей, которые написали больше 5 комментариев.

RSS feed | Trackback URI

11 комментариев »

Comment by Сергей Subscribed to comments via email
2008-05-02 15:26:24

Если конфиг правят знающие люди, они понимают, что могут случайно перезаписать переменную. :razz:
По-моему проще воспользоваться либо parse_ini_file(), либо классом из ZF Zend_Config :roll:

2008-05-03 10:52:34

Проблема в том, что они знают PHP, а не то, какие переменные сейчас используются в программе.
INI-файлы сильно простые, в них не запишешь даже элементарные расчёты вроде 60*60*24*30 или $otherVarFromConfig+15.
Zend_Config - это примерно то же, пожалуй, даже более безопасно, но писать в конфиге return array(...) просто как-то некрасиво. И, опять же, сложно сделать $var2 = $var1+15.

 
 
Comment by Snowcore
2008-05-14 08:33:44

Очень хороший подход. Мне понравилось!

 
Comment by Arefiev
2008-06-09 22:50:15

по-хорошему переменные конфига потом надо удалять их глобальной области видимости, и проверять не затерли ли мы конфигами уже существующие переменные.

2008-06-10 18:01:49

В том то и суть. В моём примере они не попадают в глобальную область видимости.

 
 
Comment by Sniff Subscribed to comments via email
2008-06-19 16:35:56

Владимир, а как с вами можно связаться? Напишите мне в почту, например.

 
2008-07-07 13:52:20

Ага это точно, ато иногда так объясняют что фиг разберёшся.

 
Comment by Сергей Subscribed to comments via email
2008-07-09 17:36:33

Если в конфиге будет задана переменная $temp, то $vars окажется пустым и $this->config вслед за ним. Простой выход - переименовать $temp в $hrentakoevkonfigeuvidish

 
Comment by sergikon Subscribed to comments via email
2008-07-10 11:48:02

$temp вредит, т.к. одноименная переменная в конфиге ломает загрузку всего конфига, да и не нужна она вообще, по-моему.


function loadConfig() {
// load new vars
include('config.php');

// get list of new vars
$vars = array_keys(get_defined_vars());

// save new vars to $this->config
$this->config = array();
foreach ($vars as $var) {
$this->config[$var] = $$var;
}
}

 
Comment by .scu Subscribed to comments via email
2008-08-18 14:05:29

Вместо изобретения велосипеда, рекомендую использование встроенной в PHP функции parse_ini_file()

При этом любой пользователь сможет пользоваться конфигом и добавлять в него свои переменные, а сам конфиг будет выглядеть примерно так:

============config.ini====================

[database]
db_host=localhost
db_username=login
db_password=pass
db_database=base
db_driver=mysql
db_encoding=utf8
sql_debug=on
[core]
gzip_compress_level=0
[frontend]
error_report_level=6143
[admin]
error_report_level=0

============end of config.ini====================

P.S. если config.ini у вас размещается в публичной директории, не забудьте добавить в .htaccess:

deny from all

т.к. apache по-умолчанию отображает *.ini файлы как текстовые.

 
Comment by mr. Subscribed to comments via email
2008-10-13 21:41:17

У меня год назад было круче (4-й пункт): http://mrkto.com/php_config_files/

 
Имя (required)
E-mail (required - never shown publicly)
URL
Текст комментария
You may use <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> in your comment.