PHP-класс для работы с INI-файлами
Класс-помощник для работы с INI-файлами. Класс реализует шаблон проектирования «Строитель». В представленном классе идет реализация функционала для работы с INI-файлами. В качестве базового функционала представлено создание, добавление и чтение секций, добавление и удаление ключей и другой функционал.
Первым делом необходимо объявить переменные, которые отвечают за структуру файла, путь к файлу и тип сканирования:
/** * @var array Структура ini файла */ private array $structure = []; /** * @var int Тип сканирования */ private int $scannerMode; /** * @var string Путь к файлу */ private string $path;
В конструкторе метода укажем путь к файлу (для создания) и тип сканирования, а также вызовем метод получения структуры файла:
public function __construct(string $path, int $scannerMode = INI_SCANNER_TYPED) < $this->path = $path; file_put_contents($path, null, LOCK_EX); $this->scannerMode = $scannerMode; $this->setInitStructure(); >
Метод получения структуры файла выглядит следующим образом:
private function setInitStructure(): void < $this->structure = parse_ini_file($this->path, true, $this->scannerMode); >
Метод parse_ini_file получает в качестве аргументов путь к файлу, флаг получения многомерного массива и типа сканирования. Мы ставим по умолчанию флаг многомерного массива как true , так как нам проще работать с такими массивами. Тип сканирования может быть:
При INI_SCANNER_RAW значения опций (ключ => значение) не будут обрабатываться. Также с версии PHP 5.6.1 завезли тип INI_SCANNER_TYPED . В этом режиме типы boolean, null и integer будут, по возможности, сохраняться. Строковые значения «true» , «on» и «yes» будут преобразованы в TRUE . «false» , «off» , «no» и «none» в FALSE . «null» преобразуется в NULL . Кроме этого, все числовые строки будут, по возможности, преобразованы к целым числам. Вроде как это лучше, чем остальные варианты, по этому используем его.
Вспомогательные методы
Напишем публичный метод получения всей структуры файла:
public function getStructure(): array < return $this->structure; >
Чаще всего необходимо получать какое-то значение или всю секцию файла. Давайте напишем простые методы получения этих значений:
public function getSection(string $section): array < return $this->structure[$section]; > public function getValue(string $section, string $key) < return $this->getSection($section)[$key]; >
С методами получения мы разобрались, теперь нам необходимо формировать файлы, чтобы записывать туда определенные значения. Можно сказать, что этот процесс называется динамическим конфигурированием. Для начала создадим метод добавления секции:
public function addSection(string $section): Ini < if (array_key_exists($section, $this->structure)) < throw new Exception("Секция уже существует"); > $this->structure[$section] = []; return $this; >
В данном случае выбрасывается простой exception, хотя лучше всего было бы использовать собственные исключения.
Теперь сделаем метод, который добавлял бы значения в определенные секцию:
public function addValues(string $section, array $values): Ini < $this->structure[$section] = array_merge($values, $this->structure[$section]); return $this; >
Но не всегда надо добавлять значения, иногда нужно из переназначать. Напишем такой метод:
public function setValues(string $section, array $values): Ini < foreach ($values as $key =>$value) < $this->structure[$section][$key] = $value; > return $this; >
С добавлением, назначением и чтением мы разобрались, теперь сделаем возможность удаления секции и ключей в секциях:
public function removeSection(string $section): Ini < unset($this->structure[$section]); return $this; > public function removeKeys(string $section, array $keys): Ini < foreach ($keys as $key) < unset($this->structure[$section][$key]); > return $this; >
Обратите внимание, что методы добавления и удаления реализуют шаблон проектирования «Строитель».
Осталось дело за малым — написать метод записи в файл:
public function write(): void < $iniContent = null; foreach ($this->structure as $section => $data) < $iniContent .= "[]\n"; foreach ($data as $key => $value) < $iniContent .= "=\n"; > $iniContent .= "\n"; > file_put_contents($this->path, $iniContent, LOCK_EX); $this->setInitStructure(); >
Надеюсь, что вам будет полезен данный помощник по работе с INI файлами в PHP. Если есть предложения по улучшению, то буду рад их выслушать.
Чтение INI-файла в PHP
INI-файлы — это обычные текстовые файлы, состоящие из определённых секций. Как правило, INI-файлы используются для сохранения определённых настроек, например, настроек языка. И, разумеется, чтобы наш сайт мог легко изменяться тем или иным образом, можно все параметры, отвечающие за это изменение, поместить в отдельный файл. И как быстро извлечь в PHP из этого файла все настройки мы и разберём в этой статье.
Для чтения INI-файла в PHP используется функция parse_ini_file(). Но прежде, чем её использовать, создадим INI-файл «settings.ini«:
В этом файле мы описали два параметра и присвоили им определённые значения. А теперь создадим PHP-файл, в котором считаем данные из созданного файла с помощью функции parse_ini_file():
$arr = parse_ini_file(«settings.ini»);
print_r($arr);
?>
В результате, Вы увидите следующую строку: «Array ( [Par1] => 10 [Par2] => 20 )«. Как видите, функция parse_ini_file() вернула массив с ключами в виде названия параметров и значениями в виде тех, что мы задавали в файле «settings.ini«.
Теперь разберём пример из реальной практики. Сделаем одну страничку, которая будет выводить текст на языке, заданным GET-параметром. Для начала создадим INI-файл «lang_en.ini«:
Теперь создадим PHP-скрипт:
$lang = isset($_GET[‘lang’])? $_GET[‘lang’]: «en»;
$langconst = parse_ini_file(«lang_$lang.ini»);
echo $langconst[‘HELLO’].» «.$langconst[‘WORLD’].»!»;
?>
Первой строкой мы проверяем: если был передан GET-параметр lang, то тогда считываем оттуда значение и записываем в переменную lang. А если никакого значения передано не было, то устанавливаем значение по умолчанию, в нашем случае: «en«. Дальше мы обращаемся к файлу нужного языка и вытаскиваем оттуда данные. Затем уже просто выводим строку, используя полученные языковые константы. В результате, мы увидим: «Hello World!«.
А теперь пришла пора доказать, почему это так удобно. Для того, чтобы добавить новый язык достаточно создать лишь ещё один файл, где перевести все языковые константы:
Сохраните данный файл под названием «lang_ru.ini«, и запустите скрипт: «адрес_скрипта.php?lang=ru«. В результате, Вы увидите: «Привет мир!».
Как видите, мы создали лишь ещё один INI-файл, перевели константы на нужный язык и всё! Таким образом, Вы легко можете создать несколько языковых версий Вашего сайта, что смотрится очень здорово, а, главное, реализация этого достаточно простая.
Создано 19.11.2010 15:26:26
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 10 ):
Здравствуйте, Михаил. Спасибо Вам за Ваши стать по PHP — очень помогают в начале освоения этого языка. Конкретно к теме по парсингу ini-фала, а точнее, выбора языка: Данный скрипт я оформил в виде функции выбора языка и создал две ссылки-переключателя, RUS и ENG. Всё работает..в пределах 1-ой страницы. А вот при навигации по сайту опять вылазит «дефолтовый» язык. Вопрос: Как реализовать «наследственность» (не знаю как еще это назвать) языка для навигации. Чтоб не приходилось постоянно кликать на выбор языка при переходе на другую страницу сайта. Заранее благодарю за ответ-совет.
Попробуйте хранить значение выбранного языка в куки, и на каждой странице сверяться с ними.
В строке $langconst = parse_ini_file(«lang_$lang.ini»); непонятно, что такое в кавычках — lang_$lang.ini
Это имя файла, например, lang_ru.ini
Получается весь контент сайта нужно переводить по слову? Это же коллосальная работа, а не проще ли параллельно создать несколько версий сайта и делать редирект с основной версии сайта с помощью header?
что означает знак вопроса и двоеточие в строке $lang = isset($_GET[‘lang’])? $_GET[‘lang’]: «en»;
Здравствуйте Михаил. Я только недавно начал учить PHP Я ввел скрип как на вашем примере: но у меня в браузере выходит только «world!» Объясните пожалуйста, что не так? или может Вы ощиблись при вводе скрипта?
Михаил а возможна ли реализация чтения text.ini в tpl файлах?
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.
Работаем с файлами INI в PHP
INI файл часто используют для сохранения настроек в простом виде. Использование его вместо xml формата довольно оправдано, потому что его легче редактировать, он более понятен новичку. В php есть встроенная функция для чтения информации из файлов ini, но нет функционала для записи информации ini.
Для чтения информации из ini можно использовать простую функцию:
// обязательно указываем вторым параметром true $info = parse_ini_file('config.ini', true); echo $info['main']['key'];
А в ini файле у нас следующее:
Надо не забывать, что 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 файл
В итоге у нас должен получиться вот такой файл:
При создании объекта путь можно указывать к несуществующему файлу, он его создаст автоматически.
Удобное чтение из 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 файла у пхп и класса никакого нет.
Минуточку внимания!
Пожалуйста, отключите блокировщики рекламы для нашего сайта, такие как AdBlocks и т.п. Поддержите наш проект.