php-extension-check/src/Extension/ExtensionDetails.php

148 lines
4.1 KiB
PHP

<?php
declare(strict_types=1);
namespace Fbrinker\ExtensionCheck\Extension;
use ReflectionExtension;
class ExtensionDetails
{
private $loadedExtensions;
/** @var ExtensionMap|null */
private $extensionMap;
public function __construct()
{
$this->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<string,string>
*/
public function getExtensionClassMap(): array
{
if (empty($this->extensionMap)) {
$this->buildExtensionMaps();
}
return $this->extensionMap->classes ?? [];
}
/**
* @return array<string,string>
*/
public function getExtensionFunctionMap(): array
{
if (empty($this->extensionMap)) {
$this->buildExtensionMaps();
}
return $this->extensionMap->functions ?? [];
}
/**
* @return array<string,string>
*/
public function getExtensionConstantMap(): array
{
if (empty($this->extensionMap)) {
$this->buildExtensionMaps();
}
return $this->extensionMap->constants ?? [];
}
/**
* @return array<string,array<string,string[]>>
*/
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
);
}
}