From 00b2643f4228f0bab858e8d2f8c0f83e065b5c95 Mon Sep 17 00:00:00 2001 From: AnthonyAxenov Date: Mon, 22 Nov 2021 14:52:05 +0800 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B5=20=D1=84=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20=D0=B2=20Helpers=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Helpers.php | 63 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/src/Helpers.php b/src/Helpers.php index 78240b8..ad0a348 100644 --- a/src/Helpers.php +++ b/src/Helpers.php @@ -52,4 +52,67 @@ final class Helpers } return $result; } + + /** + * Проверяет идентичность двух классов + * + * @param object|string $class1 + * @param object|string $class2 + * @return bool + */ + public static function isSameClass(object|string $class1, object|string $class2): bool + { + return (is_object($class1) ? $class1::class : $class1) === (is_object($class2) ? $class2::class : $class2); + } + + /** + * Тестирует наследование класса (объекта) от указанных классов + * + * @param object|string $class Объект или имя класса для проверки + * @param string[] $parents Имена классов-родителей + * @see https://www.php.net/manual/ru/function.class-parents.php + */ + public static function checkExtendsClasses(object|string $class, array $parents): bool + { + return self::checkClassesIntersection($parents, $class, 'class_parents'); + } + + /** + * Тестирует имплементацию классом (объектом) указанных интерфейсов + * + * @param object|string $actual Объект или имя класса для проверки + * @param string[] $interfaces Имена классов-интерфейсов + * @see https://www.php.net/manual/ru/function.class-implements.php + */ + public static function checkImplementsInterfaces(object|string $actual, array $interfaces): bool + { + return self::checkClassesIntersection($interfaces, $actual, 'class_implements'); + } + + /** + * Тестирует использование классом (объектом) указанных трейтов + * + * @param object|string $class + * @param string[] $traits + * @return bool + * @see https://www.php.net/manual/ru/function.class-uses.php + */ + public static function checkUsesTraits(array $traits, object|string $class): bool + { + return self::checkClassesIntersection($traits, $class, 'class_uses'); + } + + /** + * Проверяет пересечение классов указанной функцией SPL + * + * @param object|string $class Класс для проверки на вхождение, или объект, класс коего нужно проверить + * @param string[] $classes Массив классов, вхождение в который нужно проверить + * @param string $function class_parents|class_implements|class_uses + */ + protected static function checkClassesIntersection(array $classes, object|string $class, string $function): bool + { + $actual_classes = is_object($class) ? $function($class) : [$class::class]; + return is_array($actual_classes) + && !empty(array_intersect($classes, $actual_classes)); + } } \ No newline at end of file