10 private static array $loadedClasses = [];
15 $directories = self::getDirectoriesByNamespace($namespace);
16 foreach ($directories as $directory)
18 $classes = self::getClassesByPath($directory);
28 private static function getDirectoriesByNamespace(
string $namespaceDirectory):
array
30 $originalNamespaceDirectory = trim($namespaceDirectory,
'\\');
31 $namespaceDirectory = self::normalizeNamespace($namespaceDirectory);
35 $namespaceDirectories = $namespaces[$namespaceDirectory] ?? [];
39 if (empty($namespaceDirectories))
41 $namespaceParts = explode(
'\\', trim($namespaceDirectory,
'\\'));
42 $originalNamespaceParts = explode(
'\\', $originalNamespaceDirectory);
45 $partNamespace = join(
'\\', array_slice($namespaceParts, 0,
$i)) .
'\\';
46 $partNamespaceDirectories = $namespaces[$partNamespace] ??
null;
47 if (empty($partNamespaceDirectories))
52 foreach ($partNamespaceDirectories as $partNamespaceDirectoriesItem)
55 $partNamespaceDirectoriesItem[
'path']
57 . join(DIRECTORY_SEPARATOR, array_slice($originalNamespaceParts,
$i))
59 if (is_dir($originalStylePath))
61 $directories[] = $originalStylePath;
66 $partNamespaceDirectoriesItem[
'path']
68 . join(DIRECTORY_SEPARATOR, array_slice($namespaceParts,
$i))
70 if (is_dir($lowerStylePath))
72 $directories[] = $lowerStylePath;
81 foreach ($namespaceDirectories as $namespaceItem)
83 $directories[] = $namespaceItem[
'path'];
87 $directories = array_unique($directories);
89 return array_unique($directories);
92 private static function getClassesByPath(
$path):
array
94 if (isset(self::$loadedClasses[
$path]))
96 return self::$loadedClasses[
$path];
99 $pathFiles = self::getFilesByPath(
$path);
100 foreach ($pathFiles as $pathFile)
102 $classesNames = self::getClassesNamesFromFilePath($pathFile);
103 foreach ($classesNames as $className)
105 if (class_exists($className))
107 self::$loadedClasses[
$path][] = $className;
112 return self::$loadedClasses[
$path] ?? [];
115 private static function getFilesByPath(
string $path):
array
118 $directory =
new Directory(
$path);
119 if ($directory->isExists())
121 foreach ($directory->getChildren() as $child)
123 if ($child instanceof File)
125 $files[] = $child->getPath();
127 elseif ($child instanceof Directory)
129 foreach (self::getFilesByPath($child->getPath()) as $file)
138 throw new ArgumentException(
'Invalid directory path');
144 private static function getClassesNamesFromFilePath(
string $filePath):
array
147 $file =
new File($filePath);
148 if ($file->isExists() && $file->getExtension() ===
'php')
151 $tokens = token_get_all($file->getContents());
152 $tokenCount =
count($tokens);
154 for (
$i = 0;
$i < $tokenCount;
$i++)
156 if (!is_array($tokens[
$i]))
161 $tokenType = $tokens[
$i][0];
163 if ($tokenType === T_NAMESPACE)
166 for ($j =
$i + 1; $j < $tokenCount; $j++)
168 if ($tokens[$j] ===
';')
172 if (is_array($tokens[$j]) && in_array($tokens[$j][0], [T_NAME_QUALIFIED, T_STRING, T_NS_SEPARATOR]))
174 $namespace .= $tokens[$j][1];
180 if ($tokenType === T_CLASS)
182 $classNameToken =
$i + 1;
184 isset($tokens[$classNameToken]) &&
185 is_array($tokens[$classNameToken]) &&
186 $tokens[$classNameToken][0] === T_WHITESPACE
193 isset($tokens[$classNameToken]) &&
194 is_array($tokens[$classNameToken]) &&
195 $tokens[$classNameToken][0] === T_STRING
198 $className = $tokens[$classNameToken][1];
199 $classes[] = $namespace ? $namespace .
'\\' . $className : $className;
208 private static function normalizeNamespace($namespace): string
210 return trim(strtolower($namespace),
'\\') .
'\\';
static getClassesByNamespace(string $namespace)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)