xref: /plugin/combo/ComboStrap/ClassUtility.php (revision 9a0ab88082d82e55a733ad8d4d4d5950467071db)
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