PHP 5.6 或更低版本仍可运行但风险极高,需降级代码适配语法限制、手动启用缺失扩展、锁定旧版 Composer 并禁用新特性,且必须在目标环境完整测试。
绝大多数所谓“老旧系统”其实指 PHP 5.3–5.6 环境,部分政企内网甚至还在用 PHP 5.2。这些版本早已 EOL(End-of-Life),官方不再提供安全更新。但如果你必须在上面跑新逻辑,核心不是“升级 PHP”,而是“降级代码”——让语法、函数、扩展调用

以下错误在 PHP 5.6 下直接中断执行,迁移时必须逐行扫除:
?? 空合并运算符:PHP 7.0+ 才支持,老系统需改写为 isset($a) ? $a : $b
yield from:PHP 7.0 引入,PHP 5.x 只能手动遍历 + yield
[]:PHP 5.4+ 支持,若目标环境是 PHP 5.3,必须全部换成 array()
new class {}):PHP 7.0+,老系统只能用命名类或回调模拟PHP 5.3/5.4 默认不启用 json 和 mbstring 扩展,而现代框架(如 Laravel 5.1 以前版本)依赖它们。检查方式很简单:
php -m | grep -E "json|mbstring|curl"
若无输出,不能只改代码——得联系运维启用扩展,或用替代方案:
json:用 eval() 解析简单 JSON(仅限可信数据),或引入 json.php 兼容库mbstring:禁用所有 mb_* 函数,改用 iconv() 或原生 substr()/strlen()(注意 UTF-8 字节 vs 字符差异)cURL:退化到 file_get_contents() + stream_context_create() 模拟 GET/POSTComposer 本身支持 PHP 5.3+,但生成的 autoloader 会默认用 PHP 5.6+ 语法。关键动作是锁定旧版 Composer 并禁用新特性:
curl -sS https://getcomposer.org/installer | php -- --version=1.10.22
composer.json 中强制设置:"config": {
"platform": {
"php": "5.3.29"
}
}composer install 前加 COMPOSER_MEMORY_LIMIT=-1 防止因内存检测失败中断真正麻烦的从来不是语法转换,而是你不知道某个第三方包悄悄用了 __invoke 类型声明或 static::class ——这些在 PHP 5.5 以下根本不存在。上线前务必在目标环境完整跑一遍单元测试,而不是只本地验证。