三年前,我手里的项目还运行在PHP 5.6上,满屏的mysql_connect、手动拼接SQL、require_once遍地开花。那时的“现代化”意味着用上了Composer,能跑起Laravel 5.2就算跨入了新世界。
转折点出现在一次支付接口升级——老系统无法兼容TLS 1.2,运维同事深夜重启Nginx时顺手把PHP升到了7.4。没想到,三个warning变Fatal Error:mysql扩展被移除、date.timezone未配置直接报错、甚至foreach遍历null数组也不再静默失败。那晚我删掉了27个已废弃的函数封装,第一次认真读完了PHP官方迁移指南。
架构上悄然松动:我们停用了单体后台的Session共享方案,改用Redis+JWT做无状态鉴权;API层统一接入Lumen处理高并发请求,而核心业务模块抽成独立Composer包,通过语义化版本管理,在多个项目间复用订单、用户中心逻辑。

AI渲染的图片,仅供参考
工具链彻底换血:Phing自动化部署换成Laravel Envoyer+GitHub Actions;静态分析从零星跑一遍phpcs,升级为Git Hook拦截+PHPStan level 5扫描;数据库迁移不再靠手写SQL,而是用Schemaless方式定义变更,由工具自动生成可回滚的升级脚本。
最意外的是心智转变——我不再执着于“写出能跑的代码”,而是习惯性问:“这段逻辑会不会被单元测试覆盖?类型声明是否精确到可推导?错误码能否让前端准确提示而非弹‘未知错误’?”TypeScript式严谨正渗入每行PHP。
如今团队新成员入职,第一课不是学框架,而是看.gitattributes里如何设置LF换行、composer.lock为何不可删、以及为什么.env文件永远不进Git。技术栈的“重构”从没发生在某次大版本升级里,它藏在每次merge request的review意见中,落在每一条CI流水线失败的告警上,无声,但确凿。