20250711 1.1.1 Beta 3

This commit is contained in:
2025-07-11 19:40:30 +03:00
parent 83a76dc8e2
commit 3fbb7dc81c
7 changed files with 1001 additions and 10 deletions

View File

@@ -0,0 +1,36 @@
<?php
namespace goodboyalex\php_components_pack\exceptions;
use Exception;
/**
* Ошибка работы с расширением типов.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.1.1
*/
final class TypeException extends Exception
{
/**
* @var string $TypeName Имя типа.
*/
public string $TypeName;
/**
* Конструктор.
*
* @param string $typeName Имя типа.
* @param string $message Сообщение об ошибке.
*/
public function __construct (string $typeName = "", string $message = "")
{
// Запускаем базовый конструктор
parent::__construct($message);
// Присваиваем тип
$this->TypeName = $typeName;
}
}

View File

@@ -2,11 +2,13 @@
namespace goodboyalex\php_components_pack\extensions;
use Closure;
use DateMalformedStringException;
use DateTime;
use DateTimeImmutable;
use DateTimeInterface;
use Exception;
use goodboyalex\php_components_pack\exceptions\TypeException;
use UnitEnum;
/**
@@ -19,16 +21,38 @@ use UnitEnum;
*/
final class TypeExtension
{
/**
* Дефолтный метод обработки классов для ToArray.
*
* @return Closure Метод обработки классов для ToArray.
*/
public static function DEFAULT_TO_ARRAY_ON_CLASS (): Closure
{
return fn (object $class) => self::ToArray($class, self::DEFAULT_TO_ARRAY_ON_CLASS());
}
/**
* Переводит объект в массив.
*
* @param object $class Объект.
* @param callable $onClass Метод обработки классов.
*
* @return array Массив свойств типа.
* @throws TypeException Исключение, если объект не является классом.
*/
public function ToArray (object $class): array
public static function ToArray (object $class, callable $onClass): array
{
// Создаю массив результата
$result = [];
// Сперва проверяю, что объект является классом
if (!is_object($class))
// - если нет, то выбрасываю исключение
throw new TypeException($class::class, "Object is not class / Объект не является классом.");
// Затем записываю имя класса
$result["type_class"] = $class::class;
// Получаю свойства класса
$properties = get_object_vars($class);
@@ -61,6 +85,15 @@ final class TypeExtension
continue;
}
// - если значение является классом
if (is_object($value)) {
// -- добавляю в массив через рекурсию
$result[$key] = $onClass($value);
// -- следующий элемент
continue;
}
// - присваиваю значение
$result[$key] = $value;
}
@@ -73,21 +106,28 @@ final class TypeExtension
* Переводит массив в объект.
*
* @param array $array Массив свойств.
* @param string $className Требуемый класс (внимание: с namespace!).
*
* @return mixed Объект типа $className.
* @throws Exception Исключение, если объект не создан, или дата не корректного формата или пытается передать null
* не nullable типу.
* @throws TypeException Исключение, если массив не создан через ToArray, объект не создан, дата не корректного
* формата или пытается передать null не nullable типу.
*/
public function FromArray (array $array, string $className): object
public function FromArray (array $array): object
{
// Проверяю, что массив является массивом, созданным через ToArray, то есть содержит ключ type_class
if (!array_key_exists("type_class", $array))
// - если нет, то выбрасываю исключение
throw new TypeException("array", "Array is not created by ToArray / Массив не создан через ToArray.");
// Получаю имя класса
$className = $array["type_class"];
// Создаем объект
$instance = new $className();
// Проверяем, что объект создан
if (!is_object($instance) && $instance instanceof $className)
// - если нет, то выбрасываю исключение
throw new Exception("Object is not created / Объект не создан.");
throw new TypeException($className, "Object is not created / Объект не создан.");
// Получаю свойства класса
$properties = get_object_vars($instance);
@@ -109,7 +149,8 @@ final class TypeExtension
$instance->$key = new DateTime ('@' . $value);
}
catch (DateMalformedStringException) {
throw new Exception("Date is not correct format / Дата не корректного формата.");
throw new TypeException($className . "->{$key}::DateTime",
"Date is not correct format / Дата не корректного формата.");
}
// -- следующий элемент
@@ -123,8 +164,8 @@ final class TypeExtension
$instance->$key = new DateTimeImmutable('@' . $value);
}
catch (DateMalformedStringException) {
// -- создаю дату с нулевым временем, если ошибка
$instance->$key = new DateTimeImmutable();
throw new TypeException($className . "->{$key}::DateTimeImmutable",
"Date is not correct format / Дата не корректного формата.");
}
// -- следующий элемент
@@ -151,13 +192,23 @@ final class TypeExtension
$instance->$key = null;
}
catch (Exception $exception) {
throw new Exception("Cannot assign null to non-nullable property. / Невозможно присвоить null не nullable типу: {$exception->getMessage()}.");
throw new TypeException($className . "->$key",
"Cannot assign null to non-nullable property. / Невозможно присвоить null не nullable типу: {$exception->getMessage()}.");
}
// -- следующий элемент
continue;
}
// - если значение является классом
if (is_object($instance->$key) && is_array($array[$key]) && array_key_exists("type_class", $array[$key])) {
// -- добавляю в массив через рекурсию
$instance->$key = self::FromArray($array[$key]);
// -- следующий элемент
continue;
}
// - присваиваю значение
$instance->$key = $value;
}