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