20250712 1.1.1 Beta 4

This commit is contained in:
2025-07-12 16:27:53 +03:00
parent 3fbb7dc81c
commit 117deab9d8
9 changed files with 326 additions and 887 deletions

View 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` типу.

View File

@@ -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;