本文目录导读:

- 第一阶段:摸底与制定策略(动手前必做)
- 第二阶段:低风险高收益的“外科手术”(安全区)
- 第三阶段:分层架构改造(稳步推进)
- 第四阶段:引入测试与基础设施(固化防线)
- 第五阶段:渐进式数据库迁移(高级)
- 避坑指南(警惕!)
- 落地执行表(一周快速启动版)
PHP项目重构是一个系统工程,盲目动手容易“拆东墙补西墙”,下面是一套经过验证的重构路线图,按优先级从高到低分阶段推进:
第一阶段:摸底与制定策略(动手前必做)
目标:搞清楚“老项目”到底烂在哪,避免重构过程中因业务逻辑不清导致停机。
| 步骤 | 具体动作 | 关键产出 |
|---|---|---|
| 盘点现状 | 使用 phpstan 或 psalm 跑一遍静态分析;用 composer audit 检查依赖漏洞。 |
一份代码健康度报告(耦合度、死代码、兼容性)。 |
| 梳理业务核心 | 找出最核心的业务流(如支付、订单),而不是最复杂的页面。 | 明确哪些代码绝对不能动,哪些是可以重构的局部门户。 |
| 建立基线 | 在本地部署一套可运行的旧代码,并编写关键API的冒烟测试(哪怕只是记录输入输出)。 | 作为重构后的评估基准,防止功能退化。 |
| 制定止步边界 | 明确重构不做什么(如:不强行改数据库结构,不换框架版本)。 | 控制重构范围,避免无限扩散。 |
第二阶段:低风险高收益的“外科手术”(安全区)
目标:在不改变业务逻辑的前提下,先消灭技术债中的硬伤,恢复代码可维护性。
| 优先级 | 重构动作 | 操作要点 | 收益 |
|---|---|---|---|
| P0 | 消灭静态变量/全局变量 | 将 global $db 改为依赖注入(最简方法:通过构造函数传入)。 |
消除隐式状态,为后续测试打基础。 |
| P0 | 剥离SQL语句 | 将所有 SQL 封装进 Repository 类,控制器只调方法。 | 减少 SQL 注入风险,便于 SQL 调优。 |
| P1 | *替换 `mysql_` 函数** | 强制迁移到 PDO 或 mysqli,并启用预处理语句(必须)。 | 消除致命安全漏洞。 |
| P1 | 处理 die() 和 exit() |
禁止在业务逻辑层直接退出,改为抛异常,由前端控制器统一捕获。 | 避免页面白屏和状态码混乱。 |
| P2 | 抽出辅助函数 | 将重复的 printf 拼接 HTML 的代码,提取为模板组件或简单的 Helper 类。 | 改善可读性。 |
第三阶段:分层架构改造(稳步推进)
目标:将“地狱般的意大利面”切成清晰的豆腐块,此时不用框架也能受益。
-
先建“门面” (Front Controller) :
- 即使不用 Laravel/Symfony,也请创建
index.php作为唯一入口,通过?route=xxx分发到不同的 PHP 文件。 - 这条可以强制移除
include 'header.php'散落各处的混乱。
- 即使不用 Laravel/Symfony,也请创建
-
再分“三层”:
- 表现层 (View):只负责
echo变量。严禁写 SQL 或计算逻辑。 - 应用层 (Controller):负责接受输入,调用服务,传递数据。严禁 echo 或查询。
- 业务层 (Service/Domain):严禁出现 SQL 拼接(除非在 Repository)。
- 在旧代码中,先移动最烂的那个模块作为试点。
- 表现层 (View):只负责
-
使用现代Composer自动加载:
- 修改旧的
require链,改用 PSR-4 自动加载。 - 这能彻底暴露命名空间冲突和未声明的依赖。
- 修改旧的
第四阶段:引入测试与基础设施(固化防线)
目标:保证你在改代码的时候不失眠。
- 引入PHPUnit(可选但推荐):先不用写全,只需要给最核心的算法或计算类写测试。
- 引入错误日志:将
error_reporting(E_ALL)严格开启,并配置error_log,重构期间,严格禁止抑制错误 。 - 版本控制检查:确认是否用 Git,且每次重构一个模块就提交一次。
第五阶段:渐进式数据库迁移(高级)
目标:处理老项目最难缠的表名、字段混乱问题。
- 不要直接改库名,而是新建一个映射层(如 DBAL)。
- 或者采用双写/影子表策略:新表写入,旧表同步,运行几周验证数据无误后切换。
避坑指南(警惕!)
- 不要试图“重写”:如果项目还能跑,保留旧代码,重写 = 两套 Bug + 总追赶不上业务需求。
- 不要先重构路由:老项目用参数
?id=行得通,强行换成 RESTful 风格容易破坏线上链接(SEO/收藏)。 - 不要一边重构一边加需求:重构期间,冻结非紧急需求,如果老板催需求,就暂停重构,原样增加需求。
落地执行表(一周快速启动版)
| 星期 | 具体任务 |
|---|---|
| 周一 | 跑 PHPStan 静态扫描,整理出错误清单,挑出 20 个 missing return type 和死代码删除。 |
| 周二 | 将连接数据库的 mysql_connect 改为 PDO 连接(1处核心即可)。 |
| 周三 | 将某个 Controllers 里的 300 行 SQL 逻辑移到 Repository 类中。 |
| 周四 | 写一个关键功能的单元测试,跑通旧代码。 |
| 周五 | 重构第一个模块,用新代码替换,跑测试,对比基线,合并代码。 |
核心心法:重构不是“推到重来”,而是“走一步,修一步”,每一步改动后,都要能正常运行(保证绿线运行),当你知道项目哪里依赖什么、哪里在裸奔时,这个项目的可控性就开始恢复了。
如果需要针对你当前的 PHP 老项目版本(如 PHP 5.2) 做特定的升级规划,可以告诉我具体版本和代码规模,我帮你细化第一步路线图。