php项目应通过定义userrepositoryinterface接口抽象数据访问,再由mysqluserrepository等具体类实现,业务层仅依赖接口,从而解耦数据库细节、支持无缝切换存储引擎。

在PHP项目中,当用户注册逻辑里混着SQL语句、密码哈希过程夹杂着PDO连接创建、订单查询时直接调用mysql_query——这种写法会让业务代码像毛线团一样越绕越紧,改一个字段要翻五层文件,换数据库更是推倒重来。
定义数据访问抽象接口
第一步:新建 src/Repository/UserRepositoryInterface.php 文件,声明面向领域对象的操作契约。
接口只暴露业务需要的动作,不透露底层是MySQL还是Redis——【必须用interface而非abstract class,否则无法被不同实现类同时实现】。
方法签名严格对应领域语义:findById、findByEmail、save、deleteById,不出现execute、query、fetch等技术词。
这一步不做任何实现,只写接口。接口里不写注释说明“用PDO”,那是实现类该操心的事。
编写MySQL具体实现类
新建 src/Repository/MySqlUserRepository.php,实现上一步的接口。
构造函数接收 PDO 实例,不自己 new PDO——【PDO 必须由容器或启动脚本注入,否则无法统一管理连接池和事务】。
所有 SQL 语句使用命名占位符(:email),不用问号占位符;WHERE 条件字段名用反引号包裹(`email`),避免关键字冲突。
findByEmail 方法内部必须用 fetchOne 而非 fetchAll,因为邮箱唯一,返回多行会掩盖数据异常。
在业务逻辑层注入并使用
第一步:修改 UserService 构造函数,把 UserRepositoryInterface 当作参数类型声明,而不是硬编码 MySqlUserRepository。
第二步:在控制器或应用入口处,用工厂或 DI 容器实例化 MySqlUserRepository,并传给 UserService。
第三步:UserService 内部调用 $this->userRepository->save($user),完全不感知 SQL 或连接细节。
现在要切换成 Redis 存储?只需新增 RedisUserRepository 类实现同一接口,改一行注入代码,业务逻辑零改动。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











