如何在原生PHP中实现三级版本号比较及^前缀版本校验?
原生PHP版本检查实现方案(无内置函数)
核心思路
- 手动解析当前PHP版本和规则版本,拆分为主/次/修订号的数组格式
- 处理
^前缀的版本规则,转换为明确的版本范围区间 - 自定义版本比较逻辑,验证当前版本是否落在允许范围内
完整实现代码
1. 版本解析函数
将版本字符串(含^前缀)转换为三位数字数组,不足三位的自动补0
function parseVersion(string $version): array { // 去除^前缀 $version = ltrim($version, '^'); // 按点分割版本号 $parts = explode('.', $version); // 补全到三位,确保主/次/修订号都存在 while (count($parts) < 3) { $parts[] = 0; } // 转换为整数数组 return array_map('intval', $parts); }
2. 规则转范围函数
将^前缀的规则转换为具体的版本上下限
function getVersionRange(string $rule): array { $ruleParts = parseVersion($rule); [$major, $minor, $patch] = $ruleParts; if (str_starts_with($rule, '^')) { // ^X.Y.Z 语义:>=X.Y.Z 且 <(X+1).0.0 $min = [$major, $minor, $patch]; $max = [$major + 1, 0, 0]; return ['min' => $min, 'max' => $max]; } else { // 无前缀规则:仅要求>=指定版本 return ['min' => $ruleParts, 'max' => [PHP_INT_MAX, PHP_INT_MAX, PHP_INT_MAX]]; } }
3. 自定义版本比较函数
实现版本数组的大小比较逻辑
// 判断版本A是否大于等于版本B function versionGreaterOrEqual(array $a, array $b): bool { if ($a[0] > $b[0]) return true; if ($a[0] < $b[0]) return false; // 主版本相同,比较次版本 if ($a[1] > $b[1]) return true; if ($a[1] < $b[1]) return false; // 次版本相同,比较修订号 return $a[2] >= $b[2]; } // 判断版本A是否小于版本B function versionLessThan(array $a, array $b): bool { if ($a[0] < $b[0]) return true; if ($a[0] > $b[0]) return false; if ($a[1] < $b[1]) return true; if ($a[1] > $b[1]) return false; return $a[2] < $b[2]; }
4. 主检查函数
整合所有逻辑,执行版本验证
function checkPhpVersion(string $requiredRule): void { // 用PHP_VERSION常量获取当前版本,避免使用内置函数 $currentVersion = parseVersion(PHP_VERSION); $range = getVersionRange($requiredRule); $isValid = versionGreaterOrEqual($currentVersion, $range['min']) && versionLessThan($currentVersion, $range['max']); if (!$isValid) { $minStr = implode('.', $range['min']); $maxStr = implode('.', $range['max']); die("该脚本需要PHP版本 >= {$minStr} 且 < {$maxStr},当前版本是 " . PHP_VERSION); } } // 使用示例:要求PHP >=8.1.0 checkPhpVersion('8.1.0'); // 另一个示例:要求PHP >=7.4且<8.0 // checkPhpVersion('^7.4');
关键说明
- 全程使用
PHP_VERSION常量获取当前版本,未依赖任何版本处理类内置函数 ^前缀规则严格遵循语义化版本(SemVer)的兼容更新逻辑,仅允许主版本号不变的后续更新- 所有解析、比较逻辑均为原生手动实现,无框架或Composer依赖
内容的提问来源于stack exchange,提问作者Imtiaze
相关产品推荐
相关产品推荐

