20250713 1.1.1
This commit is contained in:
		
							
								
								
									
										176
									
								
								sources/traits/ObjectArray/ObjectArraySerializeExTrait.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								sources/traits/ObjectArray/ObjectArraySerializeExTrait.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | ||||
| <?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); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user