20250712 1.1.1 Beta 4
This commit is contained in:
		
							
								
								
									
										179
									
								
								sources/extensions/TypeExtension.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								sources/extensions/TypeExtension.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,179 @@ | ||||
| # Описание класса TypeExtension | ||||
|  | ||||
| ## Информация о версии | ||||
|  | ||||
| Версия класса: 1.0 | ||||
|  | ||||
| Впервые введено в пакет с версии: 1.1.1 | ||||
|  | ||||
| Описание класса: Расширение для любого типа. | ||||
|  | ||||
| ## Публичные свойства и константы класса | ||||
|  | ||||
| К публичным свойствам можно отнести следующие статичные функции: `DEFAULT_TO_ARRAY_ON_CLASS` и | ||||
| `DEFAULT_FROM_ARRAY_ON_CLASS`. Они описывают методы обработки классов по умолчанию для методов `ToArray` и `FromArray` | ||||
| соответственно. | ||||
|  | ||||
| ### Метод `DEFAULT_TO_ARRAY_ON_CLASS` | ||||
|  | ||||
| Этот метод возвращает `Closure`, который можно использовать (и он используется при значении параметра `null`) во втором | ||||
| параметре метода `ToArray`. | ||||
|  | ||||
| ### Метод `DEFAULT_FROM_ARRAY_ON_CLASS` | ||||
|  | ||||
| Этот метод возвращает `Closure`, который можно использовать (и он используется при значении параметра `null`) во втором | ||||
| параметре метода `FromArray`. | ||||
|  | ||||
| ## Методы и функции | ||||
|  | ||||
| ### Метод `ToArray` | ||||
|  | ||||
| Этот _статический_ метод переводит класс в массив. Он содержит **1 обязательный параметр**: | ||||
|  | ||||
| * `object $class` - класс, который нужно перевести в массив | ||||
|  | ||||
| и **1 необязательный параметр**: | ||||
|  | ||||
| * `?callable $onClass = null` - метод обработки классов. Если передаётся `null`, то используется | ||||
|   `DEFAULT_TO_ARRAY_ON_CLASS`. По умолчанию, `null`. | ||||
|  | ||||
| В качестве метода обработки классов `onClass` подойдет любое `Closure` вида | ||||
|  | ||||
|     fn (object $class): array => <ДЕЙСТВИЕ>; | ||||
|  | ||||
| Метод возвращает `array` - массив публичных свойств. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public static function ToArray (object $class, ?callable $onClass = null): array | ||||
|  | ||||
| Пример, | ||||
|  | ||||
|     // Создаём тестовый класс (см. TypeExtensionTest) | ||||
|     $class = new D ( | ||||
|       'test_string', | ||||
|       12345, | ||||
|       true, | ||||
|       new A("test_string_A", 6789, false), | ||||
|       new B("test_string_B", 9876, "false"), | ||||
|       new C("test_string_C", 54321, true) | ||||
|     ); | ||||
|  | ||||
|     // Создаём метод обработки классов | ||||
|     // - воспользуемся тем, что класс C реализует интерфейс ISerialize | ||||
|     $c_closure = fn (C $class): array => | ||||
|       [ | ||||
|         "type_class" => C::class, | ||||
|         "type_value" => $class->Serialize() | ||||
|       ]; | ||||
|      | ||||
|     // - зададим метод обработки | ||||
|     $closure = fn (object $class): array => $class instanceof C | ||||
|       ? $c_closure($class) | ||||
|       : TypeExtension::ToArray($class); | ||||
|  | ||||
|     // Преобразуем в массив | ||||
|     try { | ||||
|       $array = TypeExtension::ToArray($class, $closure); | ||||
|     } | ||||
|     catch (TypeException $e) { | ||||
|       // - если ошибка, то выводим её и завершаем работу | ||||
|       die($e->getMessage()); | ||||
|     } | ||||
|  | ||||
|     // Вывожу в файл | ||||
|     file_put_contents(__DIR__ . "/class.txt", json_encode($array, JSON_PRETTY_PRINT)); | ||||
|  | ||||
| В результате содержимое файла: | ||||
|  | ||||
|     { | ||||
|       "type_class": "goodboyalex\\php_components_pack\\tests\\data\\D", | ||||
|       "stringD": "test_string", | ||||
|       "intD": 12345, | ||||
|       "boolD": true, | ||||
|       "a": { | ||||
|         "type_class": "goodboyalex\\php_components_pack\\tests\\data\\A", | ||||
|         "a": "test_string_A", | ||||
|         "b": 6789, | ||||
|         "c": false | ||||
|       }, | ||||
|       "b": { | ||||
|         "type_class": "goodboyalex\\php_components_pack\\tests\\data\\B", | ||||
|         "a": "test_string_B", | ||||
|         "b": 9876, | ||||
|         "d": "false" | ||||
|       }, | ||||
|       "c": { | ||||
|         "type_class": "goodboyalex\\php_components_pack\\tests\\data\\C", | ||||
|         "type_value": "{\"string\":\"test_string_C\",\"int\":54321,\"bool\":true}" | ||||
|       } | ||||
|     } | ||||
|  | ||||
| #### Выбрасываемые исключения | ||||
|  | ||||
| Этот метод выбрасывает исключение типа `TypeException` в случае, если объект `$class` (обязательный параметр метода) не является классом. | ||||
|  | ||||
| ### Метод `FromArray` | ||||
|  | ||||
| Этот _статический_ метод переводит массив в класс. Он содержит **1 обязательный параметр**: | ||||
|  | ||||
| * `array $array` - массив публичных свойств | ||||
|  | ||||
| и **1 необязательный параметр**: | ||||
|  | ||||
| * `?callable $onClass = null` - метод обработки классов. Если передаётся `null`, то используется | ||||
|   `DEFAULT_FROM_ARRAY_ON_CLASS`. По умолчанию, `null`. | ||||
|  | ||||
| В качестве метода обработки классов `onClass` подойдет любое `Closure` вида | ||||
|  | ||||
|     fn (array $classArray): object => <ДЕЙСТВИЕ>; | ||||
|  | ||||
| Метод возвращает `object` - экземпляр класса. | ||||
|  | ||||
| Синтаксис: | ||||
|  | ||||
|     public static function FromArray (array $array, ?callable $onClass = null): object | ||||
|  | ||||
| Пример, | ||||
|  | ||||
|     // Считываем данные из файла и преобразуем в массив | ||||
|     $array = json_decode(file_get_contents(__DIR__ . "/class.txt"), true); | ||||
|  | ||||
|     // Создаём метод обработки классов | ||||
|     // - воспользуемся тем, что класс C реализует интерфейс ISerialize | ||||
|     $c_closure = function (string $serializedC): C | ||||
|     { | ||||
|       $classC = new C(); | ||||
|       $classC->UnSerialize($serializedC); | ||||
|       return $classC; | ||||
|     }; | ||||
|  | ||||
|     // - зададим метод обработки | ||||
|     $closure = fn (array $classArray): object => | ||||
|       $classArray['type_class'] == C::class | ||||
|         ? $c_closure($classArray["type_value"]) | ||||
|         : TypeExtension::FromArray($classArray); | ||||
|  | ||||
|     // Преобразуем в объект | ||||
|     try { | ||||
|       $class = TypeExtension::FromArray($array, D::CLOSURE_FROM_ARRAY()); | ||||
|     } catch (TypeException $e) { | ||||
|       // - если ошибка, то выводим её и завершаем работу | ||||
|       die($e->getMessage()); | ||||
|     } | ||||
|  | ||||
|     // Вывожу тестовую строку | ||||
|     echo $class->c->stringC; | ||||
|  | ||||
| В результате на экране отобразится: | ||||
|  | ||||
|     test_string_C | ||||
|  | ||||
| #### Выбрасываемые исключения | ||||
|  | ||||
| Этот метод выбрасывает исключение типа `TypeException` в случаях, если: | ||||
|  | ||||
| * массив `$array` не создан через метод `ToArray`; | ||||
| * при попытке создать объект, он не создаётся; | ||||
| * дата передана не корректного формата; | ||||
| * пытается передать `null` не `nullable` типу. | ||||
| @@ -28,20 +28,24 @@ final class TypeExtension | ||||
|      */ | ||||
|     public static function DEFAULT_TO_ARRAY_ON_CLASS (): Closure | ||||
|     { | ||||
|         return fn (object $class) => self::ToArray($class, self::DEFAULT_TO_ARRAY_ON_CLASS()); | ||||
|         return fn (object $class): array => self::ToArray($class); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Переводит объект в массив. | ||||
|      * | ||||
|      * @param object $class Объект. | ||||
|      * @param callable $onClass Метод обработки классов. | ||||
|      * @param callable|null $onClass Метод обработки классов. Если передаётся null, то используется | ||||
|      *     <code>DEFAULT_TO_ARRAY_ON_CLASS</code>. По умолчанию, null. | ||||
|      * | ||||
|      * @return array Массив свойств типа. | ||||
|      * @throws TypeException Исключение, если объект не является классом. | ||||
|      */ | ||||
|     public static function ToArray (object $class, callable $onClass): array | ||||
|     public static function ToArray (object $class, ?callable $onClass = null): array | ||||
|     { | ||||
|         // Проверяю, что метод обработки классов не null и если null, то присваиваю дефолтный метод | ||||
|         $onClass ??= self::DEFAULT_TO_ARRAY_ON_CLASS(); | ||||
|  | ||||
|         // Создаю массив результата | ||||
|         $result = []; | ||||
|  | ||||
| @@ -102,16 +106,28 @@ final class TypeExtension | ||||
|         return $result; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Дефолтный метод обработки классов для FromArray. | ||||
|      * | ||||
|      * @return Closure Метод обработки классов для FromArray. | ||||
|      */ | ||||
|     public static function DEFAULT_FROM_ARRAY_ON_CLASS (): Closure | ||||
|     { | ||||
|         return fn (array $classArray): object => self::FromArray($classArray); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Переводит массив в объект. | ||||
|      * | ||||
|      * @param array $array Массив свойств. | ||||
|      * @param callable|null $onClass Метод обработки классов. Если передаётся null, то используется | ||||
|      *     <code>DEFAULT_FROM_ARRAY_ON_CLASS</code>. По умолчанию, null. | ||||
|      * | ||||
|      * @return mixed Объект типа $className. | ||||
|      * @return mixed Восстановленный объект. | ||||
|      * @throws TypeException Исключение, если массив не создан через ToArray, объект не создан, дата не корректного | ||||
|      *     формата или пытается передать null не nullable типу. | ||||
|      */ | ||||
|     public function FromArray (array $array): object | ||||
|     public static function FromArray (array $array, ?callable $onClass = null): object | ||||
|     { | ||||
|         // Проверяю, что массив является массивом, созданным через ToArray, то есть содержит ключ type_class | ||||
|         if (!array_key_exists("type_class", $array)) | ||||
| @@ -186,7 +202,7 @@ final class TypeExtension | ||||
|             } | ||||
|  | ||||
|             // - если значение является NULL | ||||
|             if ($value = "null") { | ||||
|             if (is_string($value) && $value == "null") { | ||||
|                 // -- присваиваю NULL | ||||
|                 try { | ||||
|                     $instance->$key = null; | ||||
| @@ -203,7 +219,7 @@ final class TypeExtension | ||||
|             // - если значение является классом | ||||
|             if (is_object($instance->$key) && is_array($array[$key]) && array_key_exists("type_class", $array[$key])) { | ||||
|                 // -- добавляю в массив через рекурсию | ||||
|                 $instance->$key = self::FromArray($array[$key]); | ||||
|                 $instance->$key = $onClass($array[$key]); | ||||
|  | ||||
|                 // -- следующий элемент | ||||
|                 continue; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user