solid原则是面向对象设计的五个核心原则缩写,包括单一职责(srp)、开闭(ocp)、里氏替换(lsp)、接口隔离(isp)和依赖倒置(dip)原则,旨在提升代码的高内聚、低耦合、可测试性与可维护性。

什么是 SOLID 原则?
SOLID 是面向对象设计的五个核心原则缩写,不是 PHP 特有,但在 PHP 工程实践中尤其重要。它帮助写出高内聚、低耦合、易测试、可维护的代码。面试中常被问及“如何用 PHP 体现某个原则”,重点不在背定义,而在能否结合代码说明取舍和实际价值。
单一职责原则(SRP):一个类只做一件事
类的职责越单一,修改风险越小,单元测试越容易覆盖。PHP 中常见反例是把数据库操作、业务逻辑、HTTP 响应组装全塞进一个 Controller 方法里。
- ✅ 推荐做法:Controller 只协调流程,调用 Service 处理业务,Repository 负责数据存取,ResponseBuilder 封装返回结构
- ✅ 示例:用户注册逻辑拆成
UserRegistrationService(校验+创建+发邮件)和EmailNotifier(专注发送),而非让 Service 自己拼 SMTP 配置 - ⚠️ 注意:“一件事”指业务维度的职责,不是函数行数。比如
UserValidator可同时验证邮箱格式、密码强度、用户名唯一性——它们同属“注册前校验”这一职责
开闭原则(OCP):对扩展开放,对修改关闭
需求变化时,优先新增类或方法,而不是改已有稳定代码。PHP 中常用策略模式、接口多态、依赖注入来落地。
- ✅ 举例:支付方式从只支持支付宝,扩展为支持微信、PayPal。定义
PaymentGateway接口,新增WechatPayment类实现它,而不去改原有AlipayPayment或主调用逻辑 - ✅ Laravel 中的事件监听器、Form Request 验证器、Policy 授权类,都是 OCP 的自然体现——加功能不碰旧代码
- ⚠️ 关键点:识别可能变化的点(如支付渠道、通知方式、审批规则),提前抽象为接口或基类,但不过度设计
依赖倒置原则(DIP):依赖抽象,不依赖具体实现
这是解耦的核心。PHP 中最直接的体现就是类型提示用接口或抽象类,而非具体类,并通过容器自动注入。
CPWEB企业网站管理系统(以下称CPWEB)是一个基于PHP+Mysql架构的企业网站管理系统。CPWEB 采用模块化方式开发,功能强大灵活易于扩展,并且完全开放源代码,面向大中型站点提供重量级企业网站建设解决方案。CPWEB企业网站管理系统 2.2 Beta 测试版本,仅供测试,不建议使用在正式项目中,否则发生任何的后果自负。
立即学习“PHP免费学习笔记(深入)”;
- ✅ 正确写法:
public function __construct( UserRepositoryInterface $repo ),而非UserRepository - ✅ 在 Laravel 或 Symfony 中,绑定接口到具体实现(如
$this->app->bind(UserRepositoryInterface::class, EloquentUserRepository::class)),运行时动态替换 - ⚠️ 常见误区:写了接口但所有地方 new 具体类;或接口方法过多,违反接口隔离原则;或把 DTO、Entity 当作“抽象”来依赖——它们不是行为契约
里氏替换原则(LSP)与接口隔离原则(ISP):务实看待
LSP 强调子类能无缝替代父类,PHP 中因弱类型和动态特性,容易在运行时暴露问题(比如子类重写方法却抛出父类没声明的异常)。ISP 则提醒别搞“胖接口”——一个接口只包含调用方真正需要的方法。
- ✅ 实践建议:用 PHPStan 或 Psalm 检查类型兼容性;给接口命名体现用途,如
UserReadRepository和UserWriteRepository拆分读写,比一个UserRepository更符合 ISP - ✅ 在 Doctrine 或 Eloquent 中,避免让 Repository 同时承担查询构建、事务管理、缓存逻辑——按能力拆接口,实现类可组合复用
- ⚠️ 不必强求每个继承都严格 LSP,PHP 更常用组合替代继承。重点是:当用多态时,调用方不因换实现而崩溃或逻辑错乱
面试怎么答才加分?
别堆砌定义。先说场景,再讲你怎么做,最后点明收益。例如:
Q:你在项目里怎么应用依赖倒置?A:我们有个订单导出功能,最初只导 Excel,后来要加 PDF 和 CSV。我把导出逻辑抽成 OrderExporterInterface,三个实现类各自负责格式细节。Controller 构造函数类型提示这个接口,测试时用 Mock 实现快速验证业务逻辑,上线后加新格式也不动主流程——解耦了变化点,也方便单测。










