可以迁移,但不能直接换版本就上线;核心是分步验证+渐进改造,需先确认PHP8兼容性(检查composer.json的php字段、运行composer check-platform-reqs、核对框架版本),再修改each()、create_function()、assert()等已移除内容,推荐用Rector自动升级语法,并通过开启E_ALL | E_DEPRECATED、重测数据库连接等完成安全上线。

可以迁移,但不能直接换版本就上线。核心在于“分步验证+渐进改造”,跳过中间版本容易漏掉警告、埋下线上故障。
先确认项目是否真能跑在PHP8上
别只看php -v,重点查三处:
- 打开
composer.json,检查"php"字段是否允许^8.0或>=8.0;如果写的是"^7.4",Composer会直接拒绝安装PHP8兼容的包 - 运行
composer check-platform-reqs,它会列出所有扩展(如ext-mbstring、ext-pdo_mysql)是否满足PHP8要求 - 检查框架版本:ThinkPHP需≥6.0.12,Laravel需≥8.0,Yii2需≥2.0.45;老版本框架可能连启动都失败
重点改掉PHP8已移除的内容
这些不是警告,是直接报错,必须处理:
-
each()→ 全部换成foreach ($arr as $k => $v),PHP7.2起废弃,PHP8彻底删除 -
create_function()→ 改用匿名函数,例如$fn = function($a) { return $a * 2; }; -
assert('string')→ 只能传布尔表达式,如assert($x > 0),字符串形式会触发ParseError -
mysql_*系列函数(哪怕项目没用,某些老组件可能隐含调用)→ 必须替换为PDO或MySQLi预处理
用Rector自动批量升级语法
手动改几百个文件效率低还易漏,推荐用Rector做结构化重构:
立即学习“PHP免费学习笔记(深入)”;
- 执行
composer require rector/rector --dev - 新建
rector.php,配置启用SetList::PHP_80 - 先预览:
vendor/bin/rector src --dry-run,看diff确认改动合理 - 再执行:
vendor/bin/rector src,自动加上参数类型声明、构造器属性提升、联合类型等PHP8特性
测试和上线前的关键动作
光跑通不等于安全,要盯住这几项:
- 把
error_reporting设为E_ALL | E_DEPRECATED,PHP8默认不显示E_DEPRECATED,得显式打开才能捕获潜在问题 - 检查时区:没调用
date_default_timezone_set()的脚本,在PHP8中date()会抛出Warning - 留意错误级别变化:比如数组下标不存在,PHP7是
Notice,PHP8可能升级为TypeError,需补??或isset() - 数据库连接层重测:PDO的
ATTR_EMULATE_PREPARES行为、字符集自动检测逻辑在PHP8有微调



















