📌 一、弃用 & 将被移除的功能
1️⃣ 动态属性写入
- 风险:PHP 8.2 开始动态属性写入已触发 E_DEPRECATED,PHP 8.6 将更严格。
- 排查:使用 #[AllowDynamicProperties] 或者在类里显式定义所有属性。
php复制编辑class User {
public string $name;
}
// 不要在外部动态 $user->age = 30;
2️⃣ utf8_encode() 和 utf8_decode()
- 很可能在 8.6 标记弃用,为 PHP 9 移除做准备。
- 改用 mb_convert_encoding()。
3️⃣ 老的 Serializable 接口
- 推荐改用 __serialize() 和 __unserialize()。
4️⃣ create_function()
- 已弃用多年,若还存在必须替换为 Closure 或 fn()。
📌 二、类型 & 严格性提升
1️⃣ 未定义变量或数组键
- PHP 8.6 会继续提高“未定义”抛错的覆盖率。
- 尤其是空数组自动追加:$a = false; $a[] = 1; → 会抛 TypeError。
2️⃣ 内置函数对 null 的容忍度
- 例如:strlen(null)、array_keys(null),未来会直接抛 TypeError。
- 建议静态分析时启用 strict_types=1 并使用 Psalm / PHPStan 检查。
3️⃣ #[Override] 属性
- 若用 #[Override] 标记,必须真覆盖父类/接口,trait 也要匹配。
- 保证方法签名一致,否则 8.6 将报错。
4️⃣ 交叉类型(Intersection Types)
- 检查是否使用组合类型,8.6 中解析器对复杂场景会更严格,建议单测覆盖。
📌 三、语法层面
1️⃣ 字符串插值
- ${var} 这种复杂插值语法将逐步废弃,建议统一用 "Hello $var" 或 "Hello {$var}"。
2️⃣ 静态变量
- 静态变量类型更严格,推荐总是初始化时指定值。
📌 四、配置 & 性能
1️⃣ OPCache
- 检查 opcache.validate_timestamps、opcache.jit 配置是否符合预期。
- 有些 JIT/inline 行为可能影响微小性能,升级后需重新 benchmark。
2️⃣ GC 行为
- 若项目对垃圾回收敏感(如长驻 CLI、Swoole),观察 gc_status() 输出是否有异常循环引用。
3️⃣ Randomizer
- 如果依赖随机数可重复性,尽量显式指定 Random\Engine 而非 rand() / mt_rand()。
📌 五、推荐工具
✅ 启用:
- declare(strict_types=1);
- 静态分析:PHPStan / Psalm
- composer outdated 检查依赖是否支持 PHP 8.6。
🚦 一行总结
“先修所有 E_DEPRECATED,清理所有未定义用法,跑静态分析,一切稳了!”
如果需要,我可以帮你出:
- 一份 VSCode / PHPStorm 的检测规则清单
- 一份 .phpcs.xml 检查规范
- 一个 8.6 升级的 Composer 依赖兼容性检查脚本