2025-08-10 18:28:01 +03:00

81 lines
3.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Отключаю несущественные инспекции (из-за Attribute)
*
* @noinspection PhpMultipleClassDeclarationsInspection
*/
namespace goodboyalex\php_db_components_pack\attributes;
use Attribute;
use Closure;
/**
* Атрибут указания методов конвертации из/в тип для заполнения таблицы базы данных.
*
* @author Александр Бабаев
* @package php_db_components_pack
* @version 1.0
* @since 1.0
*/
#[Attribute(flags: Attribute::TARGET_PROPERTY)]
final readonly class ConvertToDB
{
/**
* @var Closure|null Метод конвертации из типа для заполнения таблицы базы данных.
*/
public ?Closure $ConvertToDB;
/**
* @var Closure|null Метод конвертации в тип для заполнения таблицы базы данных.
*/
public ?Closure $ConvertFromDB;
/**
* Конструктор.
*
* @param string|array|null $fromType Метод конвертации из типа для заполнения таблицы базы данных (может
* быть строкой (имя функции), может быть массивом (имя класса, имя метода) и null (по умолчанию)).
* @param string|array|null $toType Метод конвертации в тип для заполнения таблицы базы данных (может быть
* строкой (имя функции), может быть массивом (имя класса, имя метода) и null (по умолчанию)).
*/
public function __construct (string|array|null $fromType = null, string|array|null $toType = null)
{
$this->ConvertToDB = $fromType;
$this->ConvertFromDB = $toType;
}
/**
* Создает замыкание из переданного значения
*
* @param string|array|null $callbackData Данные для создания колбэка
*
* @return Closure|null
*/
private function CreateCallback (string|array|null $callbackData): ?Closure
{
// Если передан null
if ($callbackData === null)
// - возвращаем null
return null;
// Если передана строка - считаем это именем статического метода
if (is_string($callbackData))
// - создаём замыкание и возращаем его
return static fn (mixed $value): mixed
=> call_user_func($callbackData, $value);
// Если передан массив [класс, метод]
if (is_array($callbackData)) {
// - разбираем его
[$class, $method] = $callbackData;
// - создаём замыкание и возращаем его
return static fn (mixed $value): mixed
=> call_user_func([$class, $method], $value);
}
// В случае ошибки возвращаем null
return null;
}
}