20250709 1.1.1 Beta 2

This commit is contained in:
2025-07-10 07:37:11 +03:00
parent 6e831e2650
commit 83a76dc8e2
5 changed files with 168 additions and 1585 deletions

View 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;
}
}