173 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | ||
| 
 | ||
| namespace goodboyalex\php_components_pack\traits\JsonReWriter;
 | ||
| 
 | ||
| use goodboyalex\php_components_pack\enums\JsonErrorCode;
 | ||
| use goodboyalex\php_components_pack\exceptions\JsonException;
 | ||
| use goodboyalex\php_components_pack\interfaces\ISerializable;
 | ||
| 
 | ||
| /**
 | ||
|  * Часть кода класса 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
 | ||
|     {
 | ||
|         // Подготавливаем ключ
 | ||
|         $key = $this->PrepareKey($key);
 | ||
| 
 | ||
|         // Проверяем, существует ли ключ
 | ||
|         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
 | ||
|     {
 | ||
|         // Получаем значение ключа JSON
 | ||
|         $serializedDef = json_encode($default);
 | ||
| 
 | ||
|         // Читаем значение ключа JSON
 | ||
|         $value = $this->ReadString($key, $serializedDef);
 | ||
| 
 | ||
|         // Десериализуем значение ключа JSON
 | ||
|         return json_decode($value, true);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * Читает значение ключа 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);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * Читает значение ключа JSON как объект.
 | ||
|      *
 | ||
|      * @param string $key Ключ JSON.
 | ||
|      * @param object $default Значение по умолчанию.
 | ||
|      *
 | ||
|      * @return object Значение ключа JSON или значение по умолчанию.
 | ||
|      */
 | ||
|     public function ReadObject (string $key, object $default): object
 | ||
|     {
 | ||
|         // Получаем значение ключа JSON
 | ||
|         $serializedDef = json_encode($default);
 | ||
| 
 | ||
|         // Читаем значение ключа JSON
 | ||
|         $value = $this->ReadString($key, $serializedDef);
 | ||
| 
 | ||
|         // Десериализуем значение ключа JSON
 | ||
|         return json_decode($value);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * Читает значение ключа JSON как объект, реализующий интерфейс ISerializable.
 | ||
|      *
 | ||
|      * @param string $key Ключ JSON.
 | ||
|      * @param string $serializableClassName Имя класса, реализующего интерфейс ISerializable, с namespace.
 | ||
|      *
 | ||
|      * @return ISerializable Инициализированный объект
 | ||
|      * @throws JsonException Если класс не реализует интерфейс ISerializable
 | ||
|      */
 | ||
|     public function ReadSerializable (string $key, string $serializableClassName): ISerializable
 | ||
|     {
 | ||
|         // Создаем объект
 | ||
|         $instance = new $serializableClassName();
 | ||
| 
 | ||
|         // Проверяем, что он реализует интерфейс ISerializable
 | ||
|         if (!$instance instanceof ISerializable)
 | ||
|             // - если нет, то выбрасываем исключение
 | ||
|             throw new JsonException(errorCode: JsonErrorCode::NotISerializable,
 | ||
|                 errorMessage: "Class $serializableClassName is not implements ISerializable interface / Класс $serializableClassName не реализует интерфейс ISerializable");
 | ||
| 
 | ||
|         // Получаем строку JSON из ключа
 | ||
|         $json = $this->ReadString($key, $instance->Serialize());
 | ||
| 
 | ||
|         // Десериализуем строку JSON в объект
 | ||
|         $instance->UnSerialize($json);
 | ||
| 
 | ||
|         // Возвращаем объект
 | ||
|         return $instance;
 | ||
|     }
 | ||
| } |