应使用 version_compare() 判断 PHP 版本,因版本号非纯字典序(如 "7.10" < "7.2");检查扩展需先 extension_loaded() 再 phpversion(),避免 warning;composer.json 的 PHP 版本约束与运行时 version_compare() 需双重保障。

PHP版本判断该用 version_compare() 而不是 strcmp() 或直接比较字符串
因为 PHP 版本号不是纯字典序字符串,"7.10" 会小于 "7.2"(字符串比较时 "7.10" 为 true),但语义上 7.10 明显更新。用 <code>version_compare() 才符合语义逻辑。
它内部按段拆分、转整数比较,自动处理 alpha、beta、RC、dev 等后缀优先级。
-
version_compare("8.0.0", "8.0.0RC1", ">=")→ true(正式版 >= RC) -
version_compare("7.4.33", "8.0.0", ">")→ false(7.4 小于 8.0) - 第三个参数可选:
"、<code>"、<code>"=="、"!="、">"、">=",不传则返回 -1/0/1
判断扩展是否存在且满足最低版本,得先 extension_loaded() 再 phpversion()
直接调 phpversion("mbstring") 在扩展未启用时会返回 false,但 version_compare(false, "8.0", ">=") 会触发 warning 且结果不可靠。
- 必须先
extension_loaded("mbstring"),再调phpversion("mbstring") -
phpversion()不带参数返回 PHP 主版本;带扩展名才返回扩展版本(如"8.2.12") - 某些扩展(如
curl)的phpversion()返回空字符串,得额外判空
在 composer.json 和运行时做双重版本约束更稳妥
仅靠运行时 version_compare() 检查,无法阻止低版本环境安装包——composer 安装时根本不会执行你的 PHP 代码。
立即学习“PHP免费学习笔记(深入)”;
- composer.json 的
"require": {"php": "^8.0"}是第一道防线 - 运行时仍需检查:比如你用了
str_contains()(PHP 8.0+),就得在入口或关键函数里加if (version_compare(PHP_VERSION, "8.0.0", " - 别依赖
PHP_VERSION_ID做复杂判断:它只适合整数比较(如PHP_VERSION_ID >= 80000),但无法处理"8.0.0RC3"这类非数字后缀
注意 version_compare() 对 dev、snapshot 等前缀的隐式规则
它把 "dev-master"、"9999999-dev" 当作“无限大版本”,比任何稳定版都高;而 "1.0.0-alpha" 低于 "1.0.0",但高于 "1.0.0-alpha.1" —— 这些是语义化版本(SemVer)的约定,version_compare() 默认遵循。
- 如果你的自定义版本字符串含
"-dev",它会被识别为开发版,排序低于同主版本的正式版 - 避免混用格式:不要在同一个项目里一会儿用
"v2.1.0"、一会儿用"2.1.0",v前缀会导致比较失败(version_compare("v2.1.0", "2.1.0", "==")是 false) - 生产环境建议统一用
PHP_VERSION(不含v)做判断,最稳妥
json_encode() 的 JSON_INVALID_UTF8_IGNORE 标志直到 PHP 7.2 才支持,光看 PHP_VERSION_ID >= 70200 不够,还得确认 JSON 扩展版本是否达标。











