156 lines
6.0 KiB
PHP
156 lines
6.0 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
|
||
{
|
||
// Проверяем, существует ли ключ
|
||
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 как объект, реализующий интерфейс 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;
|
||
}
|
||
|
||
/**
|
||
* Читает значение ключа 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);
|
||
}
|
||
} |