118 rader
3.8 KiB
PHP
118 rader
3.8 KiB
PHP
|
<?php
|
||
|
declare(strict_types=1);
|
||
|
namespace Fbrinker\ExtensionCheck\Extension;
|
||
|
|
||
|
use ReflectionExtension;
|
||
|
|
||
|
class ExtensionDetails {
|
||
|
private $loadedExtensions;
|
||
|
private $extensionMap = [];
|
||
|
|
||
|
public function __construct()
|
||
|
{
|
||
|
$this->loadedExtensions = array_map('strtolower', get_loaded_extensions());
|
||
|
}
|
||
|
|
||
|
public function getLoadedExtensions(): array {
|
||
|
natcasesort($this->loadedExtensions);
|
||
|
return $this->loadedExtensions;
|
||
|
}
|
||
|
|
||
|
public function getLoadedExtensionsCount(): int {
|
||
|
return count($this->loadedExtensions);
|
||
|
}
|
||
|
|
||
|
public function getExtensionClassMap(): array {
|
||
|
if (empty($this->extensionMap)) {
|
||
|
$this->buildExtensionMaps();
|
||
|
}
|
||
|
|
||
|
return $this->extensionMap['classes'] ?? [];
|
||
|
}
|
||
|
|
||
|
public function getExtensionFunctionMap(): array {
|
||
|
if (empty($this->extensionMap)) {
|
||
|
$this->buildExtensionMaps();
|
||
|
}
|
||
|
|
||
|
return $this->extensionMap['functions'] ?? [];
|
||
|
}
|
||
|
|
||
|
public function getExtensionConstantMap(): array {
|
||
|
if (empty($this->extensionMap)) {
|
||
|
$this->buildExtensionMaps();
|
||
|
}
|
||
|
|
||
|
return $this->extensionMap['constants'] ?? [];
|
||
|
}
|
||
|
|
||
|
public function getExtensionDependencyMap(): array {
|
||
|
if (empty($this->extensionMap)) {
|
||
|
$this->buildExtensionMaps();
|
||
|
}
|
||
|
|
||
|
return $this->extensionMap['dependencies'] ?? [];
|
||
|
}
|
||
|
|
||
|
private function buildExtensionMaps(array $extensionsToExclude = []) {
|
||
|
$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 = [
|
||
|
'classes' => $extensionClasses,
|
||
|
'functions' => $extensionFunctions,
|
||
|
'constants' => $extensionConstants,
|
||
|
'dependencies' => $extensionDependencies,
|
||
|
'unchecked' => $uncheckedExtensions
|
||
|
];
|
||
|
}
|
||
|
|
||
|
}
|