使用 Composer PHP 的必需版本
作者: BrianHenryIE创建于 2025年6月1日更新于 2025年10月8日
// Try to determine the Composer minimum PHP version. if (class_exists(InstalledVersions::class)) {
$rootPackage = InstalledVersions::getRootPackage();
// TODO: refactor to a real method
$getMinimumPhpVersionFromString = function(string $versionsString) use ($highestMinimumPhpVersion): string {
if (0 < preg_match_all('/\d+(?:\.\d+)?(?:\.\d+)?/', $versionsString, $minimumPhpVersions)) {
$minimumPhpVersion = array_reduce($minimumPhpVersions[0], function ($carry, $minimumPhpVersion) {
return version_compare($minimumPhpVersion, $carry, '<')
? $minimumPhpVersion
: $carry;
}, $highestMinimumPhpVersion);
} else {
$minimumPhpVersion = $highestMinimumPhpVersion;
}
return $minimumPhpVersion;
};
/**
* "config": {
* "platform": {
* "php": "7.3.0"
* }
* }
*/
if (isset($rootPackage['config'], $rootPackage['config']['platform'], $rootPackage['config']['platform']['php'])) {
$minimumPhpVersion = $rootPackage['config']['platform']['php'];
} elseif (isset($rootPackage['require'], $rootPackage['require']['php'])) {
/**
* {
* "require": {
* "php": ">=7.4"
* }
* }
*/
$minimumPhpVersion = $getMinimumPhpVersionFromString($rootPackage['require']['php']);
} else {
// Scan all required packages for their minimum PHP version.
$reflectionClass = new \ReflectionClass(InstalledVersions::class);
$installedVersionsPath = $reflectionClass->getFileName();
$minimumPhpVersionsString = '';
$installedJsonPath = \dirname($installedVersionsPath) . '/installed.json';
if (\file_exists($installedJsonPath)) {
$installedJson = \json_decode(file_get_contents($installedJsonPath), true);
if (isset($installedJson['packages'])) {
foreach ($installedJson['packages'] as $package) {
if (isset($package['require'], $package['require']['php'])) {
$minimumPhpVersionsString .= $package['require']['php'];
}
}
}
}
$minimumPhpVersion = $getMinimumPhpVersionFromString($minimumPhpVersionsString);
}
}
内容来源: nikic/PHP-Parser