74 lines
2.9 KiB
PHP
74 lines
2.9 KiB
PHP
<?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 Compare
|
||
{
|
||
/**
|
||
* @var Closure|null $Function Метод сравнения значений.
|
||
*/
|
||
public ?Closure $Function;
|
||
|
||
/**
|
||
* Конструктор.
|
||
*
|
||
* @param string|array|null $function Метод сравнения значений (может быть строкой (имя функции), может быть
|
||
* массивом (имя класса, имя метода) и null (по умолчанию)).
|
||
*/
|
||
public function __construct (string|array|null $function = null)
|
||
{
|
||
// Преобразуем входные данные в замыкания
|
||
$this->Function = $this->CreateCallback($function);
|
||
}
|
||
|
||
/**
|
||
* Создает замыкание из переданного значения
|
||
*
|
||
* @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 $value1, mixed $value2): bool
|
||
=> call_user_func($callbackData, $value1, $value2);
|
||
|
||
// Если передан массив [класс, метод]
|
||
if (is_array($callbackData)) {
|
||
// - разбираем его
|
||
[$class, $method] = $callbackData;
|
||
|
||
// - создаём замыкание и возращаем его
|
||
return static fn (mixed $value1, mixed $value2): bool
|
||
=> call_user_func([$class, $method], $value1, $value2);
|
||
}
|
||
|
||
// В случае ошибки возвращаем null
|
||
return null;
|
||
}
|
||
} |