104fd306cSNickeau<?php 204fd306cSNickeau 304fd306cSNickeaunamespace ComboStrap; 404fd306cSNickeau 504fd306cSNickeau 604fd306cSNickeauuse ReflectionClass; 704fd306cSNickeau 804fd306cSNickeauclass ClassUtility 904fd306cSNickeau{ 1004fd306cSNickeau 1104fd306cSNickeau /** 1204fd306cSNickeau * @param object|string $objectOrClass 1304fd306cSNickeau * @return LocalPath 1404fd306cSNickeau * 1504fd306cSNickeau * Example to get the path of a class, you would call: 1604fd306cSNickeau * ``` 1704fd306cSNickeau * getClassPath($this) 1804fd306cSNickeau * ``` 1904fd306cSNickeau * @throws \ReflectionException - if this is not possible to return the path 2004fd306cSNickeau */ 2104fd306cSNickeau public static function getClassPath($objectOrClass): LocalPath 2204fd306cSNickeau { 2304fd306cSNickeau $reflector = new \ReflectionClass($objectOrClass); 2404fd306cSNickeau $fileName = $reflector->getFileName(); 2504fd306cSNickeau if ($fileName === false) { 2604fd306cSNickeau throw new \ReflectionException("The class is defined in php core or in a php extension"); 2704fd306cSNickeau } 2804fd306cSNickeau return LocalPath::createFromPathString($fileName); 2904fd306cSNickeau } 3004fd306cSNickeau 3104fd306cSNickeau public static function getClassImplementingInterface(string $interface): array 3204fd306cSNickeau { 3304fd306cSNickeau /** 3404fd306cSNickeau * The class created by reflection are not loaded 3504fd306cSNickeau * We need to load them explicitly 3604fd306cSNickeau */ 3704fd306cSNickeau self::loadingComboStrapClasses(); 3804fd306cSNickeau $class = []; 3904fd306cSNickeau $getDeclaredClasses = get_declared_classes(); 4004fd306cSNickeau foreach ($getDeclaredClasses as $className) { 4104fd306cSNickeau if (in_array($interface, class_implements($className))) { 4204fd306cSNickeau $class[] = $className; 4304fd306cSNickeau } 4404fd306cSNickeau } 4504fd306cSNickeau return $class; 4604fd306cSNickeau } 4704fd306cSNickeau 4804fd306cSNickeau /** 4904fd306cSNickeau * @throws \ReflectionException 5004fd306cSNickeau */ 5104fd306cSNickeau public static function getObjectImplementingInterface(string $interface): array 5204fd306cSNickeau { 5304fd306cSNickeau $classes = self::getClassImplementingInterface($interface); 5404fd306cSNickeau $objects = []; 5504fd306cSNickeau foreach ($classes as $class) { 5604fd306cSNickeau $classReflection = new ReflectionClass($class); 5704fd306cSNickeau if (!$classReflection->isAbstract()) { 5804fd306cSNickeau $objects[] = new $class(); 5904fd306cSNickeau } 6004fd306cSNickeau } 6104fd306cSNickeau return $objects; 6204fd306cSNickeau } 6304fd306cSNickeau 6404fd306cSNickeau public static function isLoaded(string $class): bool 6504fd306cSNickeau { 6604fd306cSNickeau return class_exists($class, false); 6704fd306cSNickeau } 6804fd306cSNickeau 6904fd306cSNickeau private static function loadingComboStrapClasses() 7004fd306cSNickeau { 7104fd306cSNickeau try { 7204fd306cSNickeau $parent = ClassUtility::getClassPath(ClassUtility::class)->getParent(); 7304fd306cSNickeau } catch (ExceptionNotFound|\ReflectionException $e) { 7404fd306cSNickeau throw new ExceptionRuntimeInternal("We could load the ClassUtility class. Error: {$e->getMessage()}"); 7504fd306cSNickeau } 7604fd306cSNickeau foreach (FileSystems::getChildrenLeaf($parent) as $child) { 77*9a0ab880Sgerardnico try { 78*9a0ab880Sgerardnico $extension = $child->getExtension(); 79*9a0ab880Sgerardnico } catch (ExceptionNotFound $e) { 80*9a0ab880Sgerardnico continue; 81*9a0ab880Sgerardnico } 82*9a0ab880Sgerardnico if($extension!=='php'){ 83*9a0ab880Sgerardnico continue; 84*9a0ab880Sgerardnico } 8504fd306cSNickeau include_once $child->toAbsoluteId(); 8604fd306cSNickeau } 8704fd306cSNickeau } 8804fd306cSNickeau} 89