INI файл часто используют для сохранения настроек в простом виде. Использование его вместо xml формата довольно оправдано, потому что его легче редактировать, он более понятен новичку. В php есть встроенная функция для чтения информации из файлов ini, но нет функционала для записи информации ini.
Для чтения информации из ini можно использовать простую функцию:
// обязательно указываем вторым параметром true
$info = parse_ini_file('config.ini', true);
echo $info['main']['key'];
А в ini файле у нас следующее:
[main]
key=value
Надо не забывать, что ini формат не поддерживает перенос на новую строку в значениях, это один из недостатков.
Запись и чтение через класс
Представляю вам php класс для работы с ini файлами. Он практически повторяет функциональность класса ини из делфи. Данный класс уже встроен в DevelStudio и находится в "engine_sdk/files/ini_ex.php".
if (!defined('_BR_'))
define('_BR_',chr(13).chr(10));
class TIniFileEx {
public $filename;
public $arr;
function __construct($file = false){
if ($file)
$this->loadFromFile($file);
}
function initArray(){
$this->arr = parse_ini_file($this->filename, true);
}
function loadFromFile($file){
$result = true;
$this->filename = $file;
if (file_exists($file) && is_readable($file)){
$this->initArray();
}
else
$result = false;
return $result;
}
function read($section, $key, $def = ''){
if (isset($this->arr[$section][$key])){
return $this->arr[$section][$key];
} else
return $def;
}
function write($section, $key, $value){
if (is_bool($value))
$value = $value ? 1 : 0;
$this->arr[$section][$key] = $value;
}
function eraseSection($section){
if (isset($this->arr[$section]))
unset($this->arr[$section]);
}
function deleteKey($section, $key){
if (isset($this->arr[$section][$key]))
unset($this->arr[$section][$key]);
}
function readSections(&$array){
$array = array_keys($this->arr);
return $array;
}
function readKeys($section, &$array){
if (isset($this->arr[$section])){
$array = array_keys($this->arr[$section]);
return $array;
}
return array();
}
function updateFile(){
$result = '';
foreach ($this->arr as $sname=>$section){
$result .= '[' . $sname . ']' . _BR_;
foreach ($section as $key=>$value){
$result .= $key .'='.$value . _BR_;
}
$result .= _BR_;
}
file_p_contents($this->filename, $result);
return true;
}
function __destruct(){
$this->updateFile();
}
}
Чем он удобен? Его легко использовать для чтения и записи ini файлов.
Запись информации в ini файл
Рассмотрим пример на основе нашего php класса.
$ini = new TIniFileEx('config.ini'); // создаем объект
$ini->write('main','key1','100'); // пишем в секцию main
$ini->write('main','key2','200');
$ini->updateFile(); // скидываем информацию в ini файл
В итоге у нас должен получиться вот такой файл:
[main]
key1=100
key2=200
При создании объекта путь можно указывать к несуществующему файлу, он его создаст автоматически.
Удобное чтение из ini файла
А теперь рассмотрим код чтения, он будет работать даже тогда, когда ини файла и нет физически, вот в чем красота работы с ини файлами:
$ini = new TIniFileEx('config.ini');
$key1 = $ini->read('main','key1','100');
// 3 параметр это значение по-умолчанию,
//если значения в ини файле нет или файла самого нет,
// будет присвоено значение по-умолчанию
$key2 = $ini->read('main','key2','200');
Здесь мы читаем значения из ини файла. Значения могут быть любыми - строки, числа. Массивы и объекты записывать и читать естественно нельзя. Для этого используйте известные функции serialize и unserialize.
В ini файле можно оставлять комментарии, они будут игнорироваться и не учитываться. Комментарий в ini начинается с новой строки и с символа ";" - точка с запятой. Пример:
[main]
; описание ключа
key=value
Ограничение на размер ini файла у пхп и класса никакого нет.
вернутся к списку