1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace ComboStrap; 4*04fd306cSNickeau 5*04fd306cSNickeau 6*04fd306cSNickeauuse ReflectionClass; 7*04fd306cSNickeau 8*04fd306cSNickeauclass ClassUtility 9*04fd306cSNickeau{ 10*04fd306cSNickeau 11*04fd306cSNickeau /** 12*04fd306cSNickeau * @param object|string $objectOrClass 13*04fd306cSNickeau * @return LocalPath 14*04fd306cSNickeau * 15*04fd306cSNickeau * Example to get the path of a class, you would call: 16*04fd306cSNickeau * ``` 17*04fd306cSNickeau * getClassPath($this) 18*04fd306cSNickeau * ``` 19*04fd306cSNickeau * @throws \ReflectionException - if this is not possible to return the path 20*04fd306cSNickeau */ 21*04fd306cSNickeau public static function getClassPath($objectOrClass): LocalPath 22*04fd306cSNickeau { 23*04fd306cSNickeau $reflector = new \ReflectionClass($objectOrClass); 24*04fd306cSNickeau $fileName = $reflector->getFileName(); 25*04fd306cSNickeau if ($fileName === false) { 26*04fd306cSNickeau throw new \ReflectionException("The class is defined in php core or in a php extension"); 27*04fd306cSNickeau } 28*04fd306cSNickeau return LocalPath::createFromPathString($fileName); 29*04fd306cSNickeau } 30*04fd306cSNickeau 31*04fd306cSNickeau public static function getClassImplementingInterface(string $interface): array 32*04fd306cSNickeau { 33*04fd306cSNickeau /** 34*04fd306cSNickeau * The class created by reflection are not loaded 35*04fd306cSNickeau * We need to load them explicitly 36*04fd306cSNickeau */ 37*04fd306cSNickeau self::loadingComboStrapClasses(); 38*04fd306cSNickeau $class = []; 39*04fd306cSNickeau $getDeclaredClasses = get_declared_classes(); 40*04fd306cSNickeau foreach ($getDeclaredClasses as $className) { 41*04fd306cSNickeau if (in_array($interface, class_implements($className))) { 42*04fd306cSNickeau $class[] = $className; 43*04fd306cSNickeau } 44*04fd306cSNickeau } 45*04fd306cSNickeau return $class; 46*04fd306cSNickeau } 47*04fd306cSNickeau 48*04fd306cSNickeau /** 49*04fd306cSNickeau * @throws \ReflectionException 50*04fd306cSNickeau */ 51*04fd306cSNickeau public static function getObjectImplementingInterface(string $interface): array 52*04fd306cSNickeau { 53*04fd306cSNickeau $classes = self::getClassImplementingInterface($interface); 54*04fd306cSNickeau $objects = []; 55*04fd306cSNickeau foreach ($classes as $class) { 56*04fd306cSNickeau $classReflection = new ReflectionClass($class); 57*04fd306cSNickeau if (!$classReflection->isAbstract()) { 58*04fd306cSNickeau $objects[] = new $class(); 59*04fd306cSNickeau } 60*04fd306cSNickeau } 61*04fd306cSNickeau return $objects; 62*04fd306cSNickeau } 63*04fd306cSNickeau 64*04fd306cSNickeau public static function isLoaded(string $class): bool 65*04fd306cSNickeau { 66*04fd306cSNickeau return class_exists($class, false); 67*04fd306cSNickeau } 68*04fd306cSNickeau 69*04fd306cSNickeau private static function loadingComboStrapClasses() 70*04fd306cSNickeau { 71*04fd306cSNickeau try { 72*04fd306cSNickeau $parent = ClassUtility::getClassPath(ClassUtility::class)->getParent(); 73*04fd306cSNickeau } catch (ExceptionNotFound|\ReflectionException $e) { 74*04fd306cSNickeau throw new ExceptionRuntimeInternal("We could load the ClassUtility class. Error: {$e->getMessage()}"); 75*04fd306cSNickeau } 76*04fd306cSNickeau foreach (FileSystems::getChildrenLeaf($parent) as $child) { 77*04fd306cSNickeau include_once $child->toAbsoluteId(); 78*04fd306cSNickeau } 79*04fd306cSNickeau } 80*04fd306cSNickeau} 81