20250709 1.1.1 Beta 2
This commit is contained in:
		
							
								
								
									
										168
									
								
								sources/extensions/TypeExtension.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								sources/extensions/TypeExtension.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,168 @@ | ||||
| <?php | ||||
|  | ||||
| namespace goodboyalex\php_components_pack\extensions; | ||||
|  | ||||
| use DateMalformedStringException; | ||||
| use DateTime; | ||||
| use DateTimeImmutable; | ||||
| use DateTimeInterface; | ||||
| use Exception; | ||||
| use UnitEnum; | ||||
|  | ||||
| /** | ||||
|  * Расширение для любого типа. | ||||
|  * | ||||
|  * @author Александр Бабаев | ||||
|  * @package php_components_pack | ||||
|  * @version 1.0 | ||||
|  * @since 1.1.1 | ||||
|  */ | ||||
| final class TypeExtension | ||||
| { | ||||
|     /** | ||||
|      * Переводит объект в массив. | ||||
|      * | ||||
|      * @return array Массив свойств типа. | ||||
|      */ | ||||
|     public function ToArray (object $class): array | ||||
|     { | ||||
|         // Создаю массив результата | ||||
|         $result = []; | ||||
|  | ||||
|         // Получаю свойства класса | ||||
|         $properties = get_object_vars($class); | ||||
|  | ||||
|         // Для каждого свойства класса | ||||
|         foreach ($properties as $key => $value) { | ||||
|             // - если значение является датой | ||||
|             if ($value instanceof DateTimeInterface) { | ||||
|  | ||||
|                 // -- добавляю в массив | ||||
|                 $result[$key] = $value->getTimestamp(); | ||||
|  | ||||
|                 // -- следующий элемент | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             // - если значение является перечислением | ||||
|             if ($value instanceof UnitEnum) { | ||||
|                 // -- получаю перечисление | ||||
|                 $result[$key] = $value->name; | ||||
|  | ||||
|                 // -- следующий элемент | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             // - если значение является NULL | ||||
|             if (is_null($value)) { | ||||
|                 // -- присваиваю NULL | ||||
|                 $result[$key] = "null"; | ||||
|                 // -- следующий элемент | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             // - присваиваю значение | ||||
|             $result[$key] = $value; | ||||
|         } | ||||
|  | ||||
|         // Возвращаю результат | ||||
|         return $result; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Переводит массив в объект. | ||||
|      * | ||||
|      * @param array $array Массив свойств. | ||||
|      * @param string $className Требуемый класс (внимание: с namespace!). | ||||
|      * | ||||
|      * @return mixed Объект типа $className. | ||||
|      * @throws Exception Исключение, если объект не создан, или дата не корректного формата или пытается передать null | ||||
|      *     не nullable типу. | ||||
|      */ | ||||
|     public function FromArray (array $array, string $className): object | ||||
|     { | ||||
|         // Создаем объект | ||||
|         $instance = new $className(); | ||||
|  | ||||
|         // Проверяем, что объект создан | ||||
|         if (!is_object($instance) && $instance instanceof $className) | ||||
|             // - если нет, то выбрасываю исключение | ||||
|             throw new Exception("Object is not created / Объект не создан."); | ||||
|  | ||||
|         // Получаю свойства класса | ||||
|         $properties = get_object_vars($instance); | ||||
|  | ||||
|         // Для каждого свойства класса | ||||
|         foreach ($properties as $key => $value) { | ||||
|             // - проверяю, есть ли свойство в массиве | ||||
|             if (!array_key_exists($key, $array)) | ||||
|                 // -- если нет, то пропускаю | ||||
|                 continue; | ||||
|  | ||||
|             // - получаю значение из массива | ||||
|             $value = $array[$key]; | ||||
|  | ||||
|             // - если значение является датой DateTime | ||||
|             if ($instance->$key instanceof DateTime && is_int($value)) { | ||||
|                 // -- присваиваю значение | ||||
|                 try { | ||||
|                     $instance->$key = new DateTime ('@' . $value); | ||||
|                 } | ||||
|                 catch (DateMalformedStringException) { | ||||
|                     throw new Exception("Date is not correct format / Дата не корректного формата."); | ||||
|                 } | ||||
|  | ||||
|                 // -- следующий элемент | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             // - если значение является датой DateTimeImmutable | ||||
|             if ($instance->$key instanceof DateTimeImmutable && is_int($value)) { | ||||
|                 // -- присваиваю значение | ||||
|                 try { | ||||
|                     $instance->$key = new DateTimeImmutable('@' . $value); | ||||
|                 } | ||||
|                 catch (DateMalformedStringException) { | ||||
|                     // -- создаю дату с нулевым временем, если ошибка | ||||
|                     $instance->$key = new DateTimeImmutable(); | ||||
|                 } | ||||
|  | ||||
|                 // -- следующий элемент | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             // - если значение является перечислением | ||||
|             if ($instance->$key instanceof UnitEnum) { | ||||
|                 // -- получаю все значения перечисления | ||||
|                 foreach ($instance->$key::getCases() as $case) | ||||
|                     // --- если значение совпадает | ||||
|                     if ($case->name === $value) | ||||
|                         // ---- присваиваю значение | ||||
|                         $instance->$key = $case; | ||||
|  | ||||
|                 // -- следующий элемент | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             // - если значение является NULL | ||||
|             if ($value = "null") { | ||||
|                 // -- присваиваю NULL | ||||
|                 try { | ||||
|                     $instance->$key = null; | ||||
|                 } | ||||
|                 catch (Exception $exception) { | ||||
|                     throw new Exception("Cannot assign null to non-nullable property. / Невозможно присвоить null не nullable типу: {$exception->getMessage()}."); | ||||
|                 } | ||||
|  | ||||
|                 // -- следующий элемент | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             // - присваиваю значение | ||||
|             $instance->$key = $value; | ||||
|         } | ||||
|  | ||||
|         // Возвращаю объект | ||||
|         return $instance; | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user