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_NORMAL (по умолчанию в PHP)

  • INI_SCANNER_RAW

При 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("Секция {$section} уже существует"); 	}  	$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 .= "[{$section}]\n";    foreach ($data as $key => $value) {   	$iniContent .= "{$key}={$value}\n";   }    $iniContent .= "\n";   }  	file_put_contents($this->path, $iniContent, LOCK_EX);   $this->setInitStructure(); }

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

ссылка на оригинал статьи https://habr.com/ru/post/519952/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *