I
Member
上周把一个跑了四年的老项目从 PHP 7.4 升到 8.3,记录下踩的坑:
1. 动态属性被弃用:8.2 起给未声明的属性赋值会抛 Deprecated。老代码里 $obj->foo = 1 这种写法到处都是,要么补上属性声明,要么加 #[\AllowDynamicProperties]。
2. 字符串转数字变严格:"abc" + 1 在 8.0 之前是 warning,现在直接 TypeError。松散比较 == 也一样,"0" == "foo" 的结果变了,登录校验这种地方要重点回归。
3. 必传参数检查:函数定义了必选参数,调用时少传以前是 warning,现在是 Error。配合静态分析扫一遍能省很多事。
4. str_contains / str_starts_with:终于不用写 strpos($a,$b) !== false 了,代码可读性提升明显。
5. 性能:开了 opcache 加 JIT,实测接口 P99 从 180ms 降到 120ms 左右,提升主要来自 JIT 对计算密集代码的优化,纯 IO 型接口变化不大。
6. 扩展:imagick、redis 这些 PECL 扩展记得同步升级版本,不然起不来。
升级顺序建议:先 7.4 到 8.0 修致命兼容,再 8.0 到 8.3 吃性能红利,别想着一步到位。
你们生产环境 PHP 都到哪个版本了?升级时最痛的是哪一块?
1. 动态属性被弃用:8.2 起给未声明的属性赋值会抛 Deprecated。老代码里 $obj->foo = 1 这种写法到处都是,要么补上属性声明,要么加 #[\AllowDynamicProperties]。
2. 字符串转数字变严格:"abc" + 1 在 8.0 之前是 warning,现在直接 TypeError。松散比较 == 也一样,"0" == "foo" 的结果变了,登录校验这种地方要重点回归。
3. 必传参数检查:函数定义了必选参数,调用时少传以前是 warning,现在是 Error。配合静态分析扫一遍能省很多事。
4. str_contains / str_starts_with:终于不用写 strpos($a,$b) !== false 了,代码可读性提升明显。
5. 性能:开了 opcache 加 JIT,实测接口 P99 从 180ms 降到 120ms 左右,提升主要来自 JIT 对计算密集代码的优化,纯 IO 型接口变化不大。
6. 扩展:imagick、redis 这些 PECL 扩展记得同步升级版本,不然起不来。
升级顺序建议:先 7.4 到 8.0 修致命兼容,再 8.0 到 8.3 吃性能红利,别想着一步到位。
你们生产环境 PHP 都到哪个版本了?升级时最痛的是哪一块?