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

74 lines
2.9 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 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;
}
}