Конфиги в формате PHP
В одной из наших программ конфигурация находится в файле config.php в таком формате:
Этот конфиг правится только умными людьми, которые знают PHP и не нужно создавать для них лишние уровни абстракций.
Задача - загрузить этот конфиг в программу. Просто сделать include('config.php') нельзя, потому что можно нечаянно перезаписать какую-то переменную, а в конфигурационном файле писать $config['param1'], $config['param2'] слишком долго.
-
class TestConfigLoader {
-
public $config;
-
-
function loadConfig() {
-
// make $temp defined var
-
$temp = null;
-
-
// get list of currently defined vars
-
-
// load new vars
-
include('config.php');
-
-
// get list of new vars
-
-
// save new vars to $this->config
-
foreach ($vars as $var) {
-
$this->config[$var] = $$var;
-
}
-
}
-
}
Идея в том, чтобы посмотреть, какие переменные добавились и добавить их в $this->config этого класса.
Как это работает:
-
$test = new TestConfigLoader();
-
$test->loadConfig();
выведет
UPDATE 29 Aug 2008: Оказывается, в CakePHP это ещё проще - http://www.debuggable.com/posts/4-cakephp-tricks:4811ad82-32dc-4a38-bc10-36304834cda3
Если конфиг правят знающие люди, они понимают, что могут случайно перезаписать переменную.

По-моему проще воспользоваться либо parse_ini_file(), либо классом из ZF Zend_Config
Проблема в том, что они знают PHP, а не то, какие переменные сейчас используются в программе.
INI-файлы сильно простые, в них не запишешь даже элементарные расчёты вроде 60*60*24*30 или $otherVarFromConfig+15.
Zend_Config - это примерно то же, пожалуй, даже более безопасно, но писать в конфиге return array(...) просто как-то некрасиво. И, опять же, сложно сделать $var2 = $var1+15.
Очень хороший подход. Мне понравилось!
по-хорошему переменные конфига потом надо удалять их глобальной области видимости, и проверять не затерли ли мы конфигами уже существующие переменные.
В том то и суть. В моём примере они не попадают в глобальную область видимости.
Владимир, а как с вами можно связаться? Напишите мне в почту, например.
Ага это точно, ато иногда так объясняют что фиг разберёшся.
Если в конфиге будет задана переменная $temp, то $vars окажется пустым и $this->config вслед за ним. Простой выход - переименовать $temp в $hrentakoevkonfigeuvidish
$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;
}
}
Вместо изобретения велосипеда, рекомендую использование встроенной в 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 файлы как текстовые.