2025-06-28 23:22:37 +03:00

171 lines
5.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace goodboyalex\php_components_pack\classes;
use goodboyalex\php_components_pack\enums\JsonErrorCode;
use goodboyalex\php_components_pack\exceptions\JsonException;
use goodboyalex\php_components_pack\traits\JsonReWriter\JsonReWriterReadTrait;
use goodboyalex\php_components_pack\traits\JsonReWriter\JsonReWriterWriteTrait;
/**
* Класс для работы с JSON-файлами.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.1.0
*/
final class JsonReWriter
{
/**
* @var string $JsonString Строка JSON.
*/
public string $JsonString {
get {
// Преобразую данные в JSON
$json = json_encode($this->JsonData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
// Проверка на ошибки
if (json_last_error() !== JSON_ERROR_NONE)
// - если есть ошибки, выбрасываем исключение
throw new JsonException(null, JsonErrorCode::FromLastError(), json_last_error_msg());
// Возвращаем JSON
return $json;
}
set {
// Чтение содержимого файла и преобразование JSON в объект
$this->JsonData = json_decode($value, true);
// Проверка на ошибки
if ($this->JsonData === null && json_last_error() !== JSON_ERROR_NONE)
// - если есть ошибки, выбрасываем исключение
throw new JsonException($value, JsonErrorCode::FromLastError(), json_last_error_msg());
}
}
/**
* @var array $JsonData Массив данных.
*/
private array $JsonData;
/**
* Конструктор класса.
*/
public function __construct ()
{
$this->JsonData = [];
}
/**
* Деструктор класса.
*/
public function __destruct ()
{
unset($this->JsonData);
}
/**
* Сохраняем JSON в файл.
*
* @param string $fileName Имя файла.
*
* @return bool Сохранены ли данные в файл: <code>true</code> - да, <code>false</code> - нет.
*/
public function SaveToFile (string $fileName): bool
{
// Запись данных в файл
return file_put_contents($fileName, $this->JsonString) !== false;
}
/**
* Загрузка данных из JSON-файла.
*
* @param string $fileName Имя файла.
*
* @return bool Загрузились ли данные из файла: <code>true</code> - да, <code>false</code> - нет.
*/
public function LoadFromFile (string $fileName): bool
{
// Проверка существования файла
if (!is_file($fileName))
// - если нет, возвращаем false
return false;
// Чтение содержимого файла
$result = file_get_contents($fileName);
// Проверка на ошибки
if ($result === false)
// - если есть ошибки, возвращаем false
return false;
// Записываем результат
$this->JsonString = $result;
// Возвращаем true, если все хорошо
return true;
}
/**
* Проверяем наличие ключа в JSON.
*
* @param string $key Ключ.
*
* @return bool true если ключ найден, false если нет.
*/
public function IsKeyExists (string $key): bool
{
// Получаем массив ключей по вложенности
$keys = $this->ParseKey($key);
// Получаем текущий массив данных
$current = $this->JsonData;
// Для каждого ключа
foreach ($keys as $key) {
// - проверяем наличие ключа в текущем массиве
if (!array_key_exists($key, $current))
// - нет? Возвращаем false
return false;
// Переходим ко вложенному массиву
$current = $current[$key];
}
// Возвращаем true, если все ключи найдены
return true;
}
/**
* Получение ключей по вложенности. Т.е., ключи вида <code>"key1/key2/key3" => ["key1", "key2", "key3"]</code>.
*
* @param string $key Ключ.
*
* @return array Ключи по вложенности.
*/
private function ParseKey (string $key): array
{
return explode('/', $key);
}
/**
* Создание ключа в JSON.
*
* @param string $key Ключ.
* @param mixed $value Значение.
*
* @return void
* @throws JsonException Если ключ не является массивом.
*/
private function CreateKey (string $key, mixed $value): void
{
}
// Подключаем методы чтения JSON
use JsonReWriterReadTrait;
// Подключаем методы записи JSON
use JsonReWriterWriteTrait;
}