176 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?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);
 | ||
|     }
 | ||
| } |