[PHP, Проектирование и рефакторинг, ООП] PHP класс для работы с INI файлами
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Касс-помощник для работы с 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. Если есть предложения по улучшению, то буду рад их выслушать.
===========
Источник:
habr.com
===========
Похожие новости:
- [Open source, Python, Data Mining, Big Data] Crime, Race and Lethal Force in the USA — Part 3 (перевод)
- [API, Big Data, Data Mining, Интерфейсы, Открытые данные] Парсинг сайта Умного Голосования и новый API на сайте ЦИК
- [Разработка веб-сайтов, PHP, Laravel] Laravel–Дайджест (14–20 сентября 2020)
- [PHP, Yii] Новости Yii 2020, выпуск 6
- [Big Data, Data Mining, Open source, Python] Crime, Race and Lethal Force in the USA — Part 2 (перевод)
- [Open source, Python, Data Mining] Crime, Race and Lethal Force in the USA — Part 1 (перевод)
- [DevOps, PHP, MySQL, PostgreSQL, Разработка веб-сайтов] Среда разработки PHP на базе Docker
- [Высокая производительность, Программирование, Проектирование и рефакторинг] Почему так важна иммутабельность (перевод)
- [PHP] Улучшения покрытия PHP кода в 2020 году (перевод)
- [WordPress, PHP, Управление разработкой, Монетизация IT-систем] Проблемы монетизации продуктов на WordPress
Теги для поиска: #_php, #_proektirovanie_i_refaktoring (Проектирование и рефакторинг), #_oop (ООП), #_php, #_ini, #_shablony_proektirovanija (шаблоны проектирования), #_php, #_proektirovanie_i_refaktoring (
Проектирование и рефакторинг
), #_oop (
ООП
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 19:57
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Касс-помощник для работы с 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); }
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; } 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(); } =========== Источник: habr.com =========== Похожие новости:
Проектирование и рефакторинг ), #_oop ( ООП ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 19:57
Часовой пояс: UTC + 5