必须分阶段升级:php 7.2 → 7.4 → 8.0;跳过7.4不可行,因其是唯一能同时捕获deprecated警告(如assert字符串参数)和行为变更(如未定义数组键从notice升为warning)的兼容性锚点,跳过将导致隐患上线后集中爆发fatal error、白屏等问题。

必须分阶段:PHP 7.2 → 7.4 → 8.0,跳过7.4会出事
直接从PHP 7.2升到8.0不可行,不是“能跑就行”,而是会漏掉关键兼容性信号。PHP 7.4是唯一能同时捕获两类问题的版本:Deprecated警告(比如assert('is_int($x)'))和行为变更(比如$arr['missing']从Notice升级为Warning并可能中断执行)。跳过它,等于把所有隐患压到上线后集中爆发。
- 运行
php -v确认当前版本,若低于7.4,先升到7.4再停一停 - 升级后立刻执行
php -l index.php扫描入口文件,再用phpcs --standard=PHPCompatibility --runtime-set testVersion 7.4做静态检查 - 特别注意
each()、create_function()、mysql_*调用——它们在7.4里已触发Deprecated,但还能跑;到了8.0直接Fatal error
扩展和依赖必须提前对齐,别等换完PHP才查
PHP版本变了,扩展ABI也变。比如Swoole:7.4兼容Swoole 4.x,8.0只认Swoole 5.0+;Redis扩展低于5.3.0在8.0里加载失败。Composer依赖更隐蔽——monolog/monolog低于2.0会卡住安装,topthink/framework低于6.0.12根本起不来。
- 执行
php -m看已加载扩展,对照官方兼容列表(如Redis ≥ 5.3.0、GD ≥ 2.3.0) - 运行
composer check-platform-reqs,它会明确告诉你哪个包锁死了PHP版本 - 框架升级有路径依赖:ThinkPHP 5.1必须先升5.2,再升6.0,最后才能上8.0;Laravel需≥8.0
代码层三类必改点:函数、类型、数组访问
不是所有报错都显眼。有些代码在7.4里只是警告,到8.0就停机;有些看似正常,实则因严格类型或错误级别变化悄悄失效。
-
assert():字符串参数(assert('is_int($x)'))必须改成布尔表达式(assert(is_int($x))),否则8.0直接Fatal -
foreach替代each():老式while循环遍历数组会崩,统一改用foreach ($arr as $k => $v) - 未定义数组键:写
$arr['key']前必须加isset($arr['key'])或用空合并$arr['key'] ?? null,否则8.0的Warning可能中断流程
用Rector自动改造,但别全信它
Rector能批量处理构造器属性提升、参数类型声明、match替换switch等,省掉大量手工劳动。但它不理解业务逻辑,比如assert()改写后是否仍满足校验意图,得人工核对。
- 安装:
composer require rector/rector --dev - 配置
rector.php启用SetList::PHP_80规则集 - 先
vendor/bin/rector src --dry-run预览改动,重点看类型声明是否合理、??是否覆盖了所有分支
最易被忽略的是错误级别变化带来的隐性中断——比如一个Warning在CLI脚本里默认不终止执行,但在Web SAPI里可能被error_reporting设置放大成致命错误。上线前务必在真实环境用error_reporting = E_ALL跑一遍关键路径。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











