php_components_pack/sources/traits/ObjectArray/ObjectArraySerializeExTrait.php
2025-07-13 12:23:08 +03:00

176 lines
7.9 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\traits\ObjectArray;
use goodboyalex\php_components_pack\classes\ObjectArray;
use goodboyalex\php_components_pack\enums\ObjectArraySerializeMethod;
use goodboyalex\php_components_pack\exceptions\TypeException;
use goodboyalex\php_components_pack\extensions\TypeExtension;
use goodboyalex\php_components_pack\models\ObjectArraySerializeOptions;
/**
* Часть кода класса ObjectArray, отвечающая за расширенный функции сериализации.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.1.1
*/
trait ObjectArraySerializeExTrait
{
/**
* Десериализует массив объектов.
*
* @param string $serialized Сериализованный массив.
* @param ObjectArraySerializeOptions|null $options Настройки сериализации. По умолчанию используется настройка по
* умолчанию.
*
* @return ObjectArray Массив объектов.
*/
public static function UnSerializeEx (string $serialized, ?ObjectArraySerializeOptions $options = null): ObjectArray
{
// По умолчанию используем настройки по умолчанию
$options ??= new ObjectArraySerializeOptions();
// Десериализуем массив объектов
return match ($options->SerializeMethod) {
// - стандартный метод UnSerialize
ObjectArraySerializeMethod::Serialize => self::UnSerializeBySerialize($serialized),
// - метод JsonEncode
ObjectArraySerializeMethod::JsonEncode => self::UnSerializeByJsonEncode($serialized),
// - метод JsonEncodeWithToArray
ObjectArraySerializeMethod::JsonEncodeWithToArray => self::UnSerializeByJsonEncodeWithToArray($serialized,
$options->OnClassFrom)
};
}
/**
* Десериализует массив объектов с помощью стандартного метода UnSerialize.
*
* @param string $serialized Сериализованный массив.
*
* @return ObjectArray Массив объектов.
*/
private static function UnSerializeBySerialize (string $serialized): ObjectArray
{
// Создаем новый объект
$result = new ObjectArray();
// Десериализуем массив объектов с помощью стандартного метода
$result->UnSerialize($serialized);
// Возвращаем результат
return $result;
}
/**
* Десериализует массив объектов с помощью метода JsonEncode.
*
* @param string $serialized Сериализованный массив.
*
* @return ObjectArray Массив объектов.
*/
private static function UnSerializeByJsonEncode (string $serialized): ObjectArray
{
// Десериализуем массив
$container = json_decode($serialized, false, flags: JSON_UNESCAPED_UNICODE);
// Создаем новый объект
return new ObjectArray($container);
}
/**
* Десериализует массив объектов с помощью метода JsonEncodeWithToArray.
*
* @param string $serialized Сериализованный массив.
* @param callable|null $onClass Функция обратного вызова для десериализации объекта методом JsonEncodeWithToArray.
* Она передается в качестве параметра в функцию FromArray и служит для правильного преобразования массива в
* тип.
*
* @return ObjectArray Массив объектов.
*/
private static function UnSerializeByJsonEncodeWithToArray (string $serialized, ?callable $onClass): ObjectArray
{
// Десериализуем массив
$container = json_decode($serialized, true, flags: JSON_UNESCAPED_UNICODE);
// Создаем новый объект, в который будем помещать объекты
$result = new ObjectArray();
// Переберем все объекты в контейнере
foreach ($container as $item)
try {
// - пробуем преобразовать массив в объект, если это возможно
$result[] = TypeExtension::FromArray($item, $onClass);
}
catch (TypeException) {
// - если не получилось, то просто добавляем объект в массив
$result[] = $item;
}
// Возвращаем результат
return $result;
}
/**
* Сериализует массив объектов.
*
* @param ObjectArraySerializeOptions|null $options Настройки сериализации. По умолчанию используется настройка по
* умолчанию.
*
* @return string Сериализованный массив.
*/
public function SerializeEx (?ObjectArraySerializeOptions $options = null): string
{
// По умолчанию используем настройки по умолчанию
$options ??= new ObjectArraySerializeOptions();
// Сериализуем массив
return match ($options->SerializeMethod) {
// - стандартный метод Serialize
ObjectArraySerializeMethod::Serialize => $this->Serialize(),
// - метод JsonEncode
ObjectArraySerializeMethod::JsonEncode => $this->SerializeByJsonEncode(),
// - метод JsonEncodeWithToArray
ObjectArraySerializeMethod::JsonEncodeWithToArray => $this->SerializeByJsonEncodeWithToArray($options->OnClassTo)
};
}
/**
* Сериализует массив методом JsonEncode.
*
* @return string Сериализованный массив.
*/
private function SerializeByJsonEncode (): string
{
return json_encode($this->Container, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
/**
* Сериализует массив методом JsonEncodeWithToArray.
*
* @param callable|null $onClass Функция обратного вызова для сериализации объекта методом JsonEncodeWithToArray.
* Она передается в качестве параметра в функцию ToArray и служит для правильного преобразования типа в массив.
*
* @return string Сериализованный массив.
*/
private function SerializeByJsonEncodeWithToArray (?callable $onClass): string
{
// Создадим массив, в который будем помещать объекты
$container = [];
// Переберем все объекты в контейнере
foreach ($this->Container as $item)
try {
// - пробуем преобразовать объект в массив, если это возможно
$container[] = TypeExtension::ToArray($item, $onClass);
}
catch (TypeException) {
// - если не получилось, то просто добавляем объект в массив
$container[] = $item;
}
// Возвращаем сериализованный массив
return json_encode($container, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
}