I
Member
项目从 PHP 8.1 升到 8.3 后,顺手把一批值对象改成了 readonly 类和枚举,记录一下改造时的取舍。一、readonly 类适合纯值对象。DTO、配置对象、订单快照这类只读数据用 readonly 类,构造后不可改,能省掉一堆防御性拷贝。但注意 readonly 类不能有静态属性以外的可写属性,带缓存字段的类不适合。二、枚举替代魔法字符串。状态、类型字段原来用字符串常量,改成纯枚举或回退枚举后,类型错误在传参时就能发现,不用等到运行时。回退枚举适合要落库的场景,纯枚举适合纯内存流转。三、改造别一次性全改。先从边界清晰的模块改起,跑通测试再扩散。readonly 和旧代码混用时,旧代码如果尝试修改属性会直接报错,正好暴露隐藏的修改点。四、序列化要留意。readonly 对象 json_encode 没问题,但反序列化重建时要走构造函数,不能直接给属性赋值,ORM 或缓存层如果用反射赋值会踩坑,先确认所用库的兼容性。五、性能不是改造理由。readonly 带来的性能提升微乎其微,改造的真正收益是可读性和防误改,别为了性能去改。你们升级到 8.3 后用 readonly 类和枚举了吗?改造时踩过哪些兼容坑?