20250628
Бета 1.1
This commit is contained in:
		
							
								
								
									
										163
									
								
								sources/classes/JsonReWriter.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								sources/classes/JsonReWriter.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,163 @@ | ||||
| <?php | ||||
|  | ||||
| namespace goodboyalex\php_components_pack\classes; | ||||
|  | ||||
| use goodboyalex\php_components_pack\exceptions\JsonException; | ||||
| use goodboyalex\php_components_pack\traits\JsonReWriter\JsonReWriterReadTrait; | ||||
|  | ||||
| /** | ||||
|  * Класс для работы с JSON-файлами. | ||||
|  * | ||||
|  * @author Александр Бабаев | ||||
|  * @package php_components_pack | ||||
|  * @version 1.0 | ||||
|  * @since 1.1.0 | ||||
|  */ | ||||
| final class JsonReWriter | ||||
| { | ||||
|     /** | ||||
|      * @var array $JsonData Массив данных. | ||||
|      */ | ||||
|     public array $JsonData; | ||||
|  | ||||
|     /** | ||||
|      * Конструктор класса. | ||||
|      */ | ||||
|     public function __construct () | ||||
|     { | ||||
|         $this->JsonData = []; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Деструктор класса. | ||||
|      */ | ||||
|     public function __destruct () | ||||
|     { | ||||
|         unset($this->JsonData); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Сохраняем JSON в файл. | ||||
|      * | ||||
|      * @param string $fileName Имя файла. | ||||
|      * | ||||
|      * @return void | ||||
|      * @throws JsonException Если файл не может быть сохранен. | ||||
|      */ | ||||
|     public function SaveToFile (string $fileName): void | ||||
|     { | ||||
|         // Запись данных в файл | ||||
|         file_put_contents($fileName, json_encode($this->JsonData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); | ||||
|  | ||||
|         // Проверка на ошибки | ||||
|         if (json_last_error() !== JSON_ERROR_NONE) | ||||
|             // - если есть ошибки, выбрасываем исключение | ||||
|             throw new JsonException($fileName, json_last_error(), json_last_error_msg()); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Загрузка данных из JSON-файла. | ||||
|      * | ||||
|      * @param string $fileName Имя файла. | ||||
|      * | ||||
|      * @return void | ||||
|      * @throws JsonException Если файл не существует или содержит ошибки. | ||||
|      */ | ||||
|     public function LoadFromFile (string $fileName): void | ||||
|     { | ||||
|         // Проверка существования файла | ||||
|         if (!is_file($fileName)) | ||||
|             // - нет? Выбрасываем исключение | ||||
|             throw new JsonException($fileName, -1, "File does not exist / Файл не существует"); | ||||
|  | ||||
|         // Чтение содержимого файла и преобразование JSON в объект | ||||
|         $this->JsonData = json_decode(file_get_contents($fileName), true); | ||||
|  | ||||
|         // Проверка на ошибки | ||||
|         if ($this->JsonData === null && json_last_error() !== JSON_ERROR_NONE) | ||||
|             // - если есть ошибки, выбрасываем исключение | ||||
|             throw new JsonException($fileName, json_last_error(), json_last_error_msg()); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Проверяем наличие ключа в 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 | ||||
|     { | ||||
|         // Получаем массив ключей по вложенности | ||||
|         $keys = $this->ParseKey($key); | ||||
|  | ||||
|         // Получаем текущий массив данных | ||||
|         $current = &$this->JsonData; | ||||
|  | ||||
|         // Для каждого ключа до предпоследнего | ||||
|         for ($i = 0; $i < count($keys) - 1; $i++) { | ||||
|             // - проверяем наличие ключа в текущем массиве | ||||
|             if (!isset($current[$keys[$i]])) | ||||
|                 // - нет? Создаем ключ (массив) | ||||
|                 $current[$keys[$i]] = []; | ||||
|  | ||||
|             // - проверяем, что ключ является массивом | ||||
|             if (!is_array($current[$keys[$i]])) | ||||
|                 // - нет? Выбрасываем исключение | ||||
|                 throw new JsonException(null, -1, "Key is not an array / Ключ не является массивом!"); | ||||
|  | ||||
|             // - переходим ко вложенному массиву | ||||
|             $current = &$current[$keys[$i]]; | ||||
|         } | ||||
|  | ||||
|         // Создаем ключ (значение) | ||||
|         $current[$keys[count($keys) - 1]] = $value; | ||||
|     } | ||||
|      | ||||
|     // Подключаем методы чтения JSON | ||||
|     use JsonReWriterReadTrait; | ||||
| } | ||||
							
								
								
									
										67
									
								
								sources/exceptions/JsonException.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								sources/exceptions/JsonException.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | ||||
| <?php | ||||
|  | ||||
| namespace goodboyalex\php_components_pack\exceptions; | ||||
|  | ||||
| use Exception; | ||||
|  | ||||
| /** | ||||
|  * Ошибка работы с JSON. | ||||
|  * | ||||
|  * @author Александр Бабаев | ||||
|  * @package php_components_pack | ||||
|  * @version 1.0 | ||||
|  * @since 1.1.0 | ||||
|  */ | ||||
| final class JsonException extends Exception | ||||
| { | ||||
|     /** | ||||
|      * @var string|null $JsonFileName Имя файла JSON. | ||||
|      */ | ||||
|     public ?string $JsonFileName; | ||||
|  | ||||
|     /** | ||||
|      * @link https://www.php.net/manual/ru/function.json-last-error.php | ||||
|      * @var int $JsonErrorCode Код ошибки JSON. | ||||
|      */ | ||||
|     public int $JsonErrorCode; | ||||
|  | ||||
|     /** | ||||
|      * @link https://www.php.net/manual/ru/function.json-last-error-msg.php | ||||
|      * @var string|null $JsonErrorMessage Сообщение об ошибке JSON. | ||||
|      * | ||||
|      * Внимание! В отличие от функции json_last_error_msg(), данная переменная при отсутствии ошибок выводит null, а не | ||||
|      *     "No error". | ||||
|      */ | ||||
|     public ?string $JsonErrorMessage; | ||||
|  | ||||
|     /** | ||||
|      * Конструктор. | ||||
|      * | ||||
|      * @param string|null $fileName Имя файла JSON. | ||||
|      * @param int $errorCode Код ошибки JSON. | ||||
|      * @param string|null $errorMessage Сообщение об ошибке JSON. | ||||
|      */ | ||||
|     public function __construct (?string $fileName = null, int $errorCode = JSON_ERROR_NONE, | ||||
|         ?string $errorMessage = null) | ||||
|     { | ||||
|         // Если код ошибки JSON равен 0 | ||||
|         if ($errorMessage === "No error") | ||||
|             // - то присваиваем ему null для совместимости | ||||
|             $errorMessage = null; | ||||
|  | ||||
|         // Сохраняем сообщение об ошибке | ||||
|         $this->JsonErrorMessage = $errorMessage; | ||||
|  | ||||
|         // Если сообщение пусто, то присваиваем ему "" для совместимости | ||||
|         $errorMessage = $errorMessage ?? ""; | ||||
|  | ||||
|         // Запускаем базовый конструктор | ||||
|         parent::__construct($errorMessage); | ||||
|  | ||||
|         // Присваиваем имя файла | ||||
|         $this->JsonFileName = $fileName; | ||||
|  | ||||
|         // Присваиваем код ошибки | ||||
|         $this->JsonErrorCode = $errorCode; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										119
									
								
								sources/traits/JsonReWriter/JsonReWriterReadTrait.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								sources/traits/JsonReWriter/JsonReWriterReadTrait.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | ||||
| <?php | ||||
|  | ||||
| namespace goodboyalex\php_components_pack\traits\JsonReWriter; | ||||
|  | ||||
| /** | ||||
|  * Часть кода класса JsonReWriter, отвечающая за методы чтения ключей и значений JSON. | ||||
|  * | ||||
|  * @author Александр Бабаев | ||||
|  * @package php_components_pack | ||||
|  * @version 1.0 | ||||
|  * @since 1.1.0 | ||||
|  */ | ||||
| trait JsonReWriterReadTrait | ||||
| { | ||||
|     /** | ||||
|      * Читает значение ключа JSON как целое число. | ||||
|      * | ||||
|      * @param string $key Ключ JSON. | ||||
|      * @param int $default Значение по умолчанию. | ||||
|      * | ||||
|      * @return int Значение ключа JSON или значение по умолчанию. | ||||
|      */ | ||||
|     public function ReadInt (string $key, int $default = 0): int | ||||
|     { | ||||
|         return (int)$this->Read($key, $default); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Читает значение ключа JSON. | ||||
|      * | ||||
|      * @param string $key Ключ JSON. | ||||
|      * @param mixed $default Значение по умолчанию. | ||||
|      * | ||||
|      * @return mixed Значение ключа JSON или значение по умолчанию. | ||||
|      */ | ||||
|     public function Read (string $key, mixed $default = null): mixed | ||||
|     { | ||||
|         if (!$this->IsKeyExists($key)) | ||||
|             return $default; | ||||
|  | ||||
|         $keys = $this->ParseKey($key); | ||||
|  | ||||
|         // Получаем текущий массив данных | ||||
|         $current = $this->JsonData; | ||||
|  | ||||
|         // Для каждого ключа до предпоследнего | ||||
|         for ($i = 0; $i < count($keys) - 1; $i++) | ||||
|             // - переходим ко вложенному массиву | ||||
|             $current = &$current[$keys[$i]]; | ||||
|  | ||||
|         // Возвращаем значение последнего ключа и если его нет, то возвращаем значение по умолчанию | ||||
|         return $current[$keys[count($keys) - 1]] ?? $default; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Читает значение ключа JSON как вещественное число. | ||||
|      * | ||||
|      * @param string $key Ключ JSON. | ||||
|      * @param float $default Значение по умолчанию. | ||||
|      * | ||||
|      * @return float Значение ключа JSON или значение по умолчанию. | ||||
|      */ | ||||
|     public function ReadFloat (string $key, float $default = 0.0): float | ||||
|     { | ||||
|         return (float)$this->Read($key, $default); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Читает значение ключа JSON как логическое значение. | ||||
|      * | ||||
|      * @param string $key Ключ JSON. | ||||
|      * @param bool $default Значение по умолчанию. | ||||
|      * | ||||
|      * @return bool Значение ключа JSON или значение по умолчанию. | ||||
|      */ | ||||
|     public function ReadBool (string $key, bool $default = false): bool | ||||
|     { | ||||
|         return (bool)$this->Read($key, $default); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Читает значение ключа JSON как массив. | ||||
|      * | ||||
|      * @param string $key Ключ JSON. | ||||
|      * @param array $default Значение по умолчанию. | ||||
|      * | ||||
|      * @return array Значение ключа JSON или значение по умолчанию. | ||||
|      */ | ||||
|     public function ReadArray (string $key, array $default = []): array | ||||
|     { | ||||
|         return (array)$this->Read($key, $default); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Читает значение ключа JSON как объект. | ||||
|      * | ||||
|      * @param string $key Ключ JSON. | ||||
|      * @param object $default Значение по умолчанию. | ||||
|      * | ||||
|      * @return object Значение ключа JSON или значение по умолчанию. | ||||
|      */ | ||||
|     public function ReadObject (string $key, object $default): object | ||||
|     { | ||||
|         return (object)$this->Read($key, $default); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Читает значение ключа JSON как строку. | ||||
|      * | ||||
|      * @param string $key Ключ JSON. | ||||
|      * @param string $default Значение по умолчанию. | ||||
|      * | ||||
|      * @return string Значение ключа JSON или значение по умолчанию. | ||||
|      */ | ||||
|     public function ReadString (string $key, string $default = ""): string | ||||
|     { | ||||
|         return (string)$this->Read($key, $default); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user