高内聚低耦合是php可落地的设计原则:高内聚指类只履单一职责、方法强相关;低耦合指依赖接口而非具体实现,通过依赖注入解耦。重构需拆职责、抽接口、去new、加类型提示,兼顾实际项目复杂度。

高内聚低耦合不是口号,是 PHP 工程实践中可落地的设计原则。面试中被问到,光背定义没用,得说清“怎么识别”“怎么改”“改了有什么实际好处”。
什么是高内聚?——看类/模块是不是“干好自己的事”
一个类只负责一个明确的职责,方法之间强相关,数据和行为高度集中。比如 UserAuthenticator 类只处理登录、登出、Token 验证,不掺杂发邮件、写日志或更新用户资料。
常见低内聚信号:
- 一个类里既有数据库操作,又有 HTTP 请求逻辑,还顺手格式化前端 JSON
- 方法命名五花八门(
saveUser、sendWelcomeEmail、logActivity)却都在同一个类里 - 修改密码逻辑和重置 Token 逻辑混在
User模型里,牵一发而动全身
什么是低耦合?——看依赖是不是“松的、可换的、不硬编码的”
模块之间通过接口或抽象通信,不直接 new 具体类,也不强依赖某个框架组件或第三方 SDK 的内部细节。
立即学习“PHP免费学习笔记(深入)”;
典型高耦合写法:
-
new PDO(...)直接写在业务逻辑里 → 换数据库驱动就得改所有地方 -
$mailer = new PHPMailer();写死在注册流程中 → 想切到 SendGrid 就得重写逻辑 - 控制器里直接调用
Cache::redis()->get(...)→ 缓存换为 APCu 就崩
解耦关键动作:用依赖注入 + 接口约定。例如定义 MailerInterface,让 SendGridMailer 和 SMTPMailer 都实现它;控制器只依赖接口,运行时由容器注入具体实例。
mallcloud商城基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离vue的企业级微服务敏捷开发系统架构。并引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手容易,适合学习和企业中使用。真正实现了基于RBAC、jwt和oauth2的无状态统一权限认证的解决方案,面向互联网设计同时适合B端和C端用户,支持CI/CD多环境部署,并提
面试常考改造题:从紧耦合代码到可维护结构
给一段“用户注册后发邮件+写日志+存缓存”的过程式代码,怎么重构?
标准思路:
- 拆职责:注册逻辑归
UserRegisterService,发邮件归UserMailer,日志归ActivityLogger,缓存归UserCache - 抽接口:定义
MailerInterface、LoggerInterface、CacheInterface - 去 new:构造函数接收接口类型参数(依赖注入),不自己创建对象
- 加契约:用类型提示约束传入对象必须满足接口,PHP 8 可配合联合类型或属性注入更清晰
效果:单元测试能 mock 各个依赖;换邮件服务商只需新增一个实现类 + 改 DI 配置;加新功能(如注册后推送站内信)不影响原有类。
别踩坑:高内聚低耦合 ≠ 过度分层
不是类越多越好,不是每层都加 interface 就高级。真实项目里要权衡:
- 小项目或脚本型应用,硬套六边形架构反而拖慢迭代
- 临时工具类(如 Excel 导出辅助)没必要单独抽 interface,稳定后再提炼
- 过度抽象会导致调用链过长(A→B→C→D→E),阅读成本上升,反而降低可维护性
判断标准很简单:改一个需求,是否只动 1~2 个文件?上线后 bug 是否集中在某一层?如果答案是肯定的,说明结构已足够合理。
不复杂但容易忽略 —— 真正拉开差距的,是你能不能在写第一行代码前,就想到三个月后别人怎么改它。










