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