loadedExtensions = array_map('strtolower', get_loaded_extensions()); } /** * @return string[] */ public function getLoadedExtensions(): array { natcasesort($this->loadedExtensions); return $this->loadedExtensions; } public function getLoadedExtensionsCount(): int { return count($this->loadedExtensions); } /** * @return array */ public function getExtensionClassMap(): array { if (empty($this->extensionMap)) { $this->buildExtensionMaps(); } return $this->extensionMap->classes ?? []; } /** * @return array */ public function getExtensionFunctionMap(): array { if (empty($this->extensionMap)) { $this->buildExtensionMaps(); } return $this->extensionMap->functions ?? []; } /** * @return array */ public function getExtensionConstantMap(): array { if (empty($this->extensionMap)) { $this->buildExtensionMaps(); } return $this->extensionMap->constants ?? []; } /** * @return array> */ public function getExtensionDependencyMap(): array { if (empty($this->extensionMap)) { $this->buildExtensionMaps(); } return $this->extensionMap->dependencies ?? []; } /** * @param string[] $extensionsToExclude */ private function buildExtensionMaps(array $extensionsToExclude = []): void { $extensionClasses = $extensionFunctions = $extensionConstants = $extensionDependencies = $uncheckedExtensions = []; foreach ($this->loadedExtensions as $loadedExtension) { if (in_array(strtolower($loadedExtension), array_map('strtolower', $extensionsToExclude))) { continue; } $extension = new ReflectionExtension($loadedExtension); $classes = $extension->getClasses(); if (!empty($classes)) { natcasesort($classes); foreach ($classes as $class) { $extensionClasses[$class->getName()] = $loadedExtension; } } $functions = $extension->getFunctions(); if (!empty($functions)) { natcasesort($functions); foreach ($functions as $function) { $extensionFunctions[$function->getName()] = $loadedExtension; } } $constants = $extension->getConstants(); if (!empty($constants)) { natcasesort($constants); foreach ($constants as $constant => $_) { $extensionConstants[$constant] = $loadedExtension; } } $dependencies = $extension->getDependencies(); if (!empty($dependencies)) { natcasesort($dependencies); foreach ($dependencies as $dependency => $status) { if (!isset($extensionDependencies[$loadedExtension][strtolower($status)])) { $extensionDependencies[$loadedExtension][strtolower($status)] = []; } $extensionDependencies[$loadedExtension][strtolower($status)][] = $dependency; } } // $extension->getINIEntries() // should we check the ini for configured extensions? if (empty($classes) && empty($functions)) { $uncheckedExtensions[] = $extension->getName(); } } $this->extensionMap = new ExtensionMap( $extensionClasses, $extensionFunctions, $extensionConstants, $extensionDependencies, $uncheckedExtensions ); } }