本文目录导读:

我来详细解释PHP职责分离的概念和实现方式。
什么是职责分离
职责分离(Separation of Concerns)是一种设计原则,将应用程序的不同功能模块分开,使每个部分专注于特定的任务。
PHP中的职责分离实现
MVC模式(最常用)
// Model - 数据处理
class UserModel {
public function getUser($id) {
// 数据库查询逻辑
return Database::query("SELECT * FROM users WHERE id = ?", [$id]);
}
}
// View - 视图显示
class UserView {
public function render($data) {
echo "<h1>" . $data['name'] . "</h1>";
echo "<p>Email: " . $data['email'] . "</p>";
}
}
// Controller - 业务逻辑
class UserController {
private $model;
private $view;
public function showUser($id) {
$user = $this->model->getUser($id);
$this->view->render($user);
}
}
Service层分离
// 业务逻辑层
class OrderService {
private $paymentGateway;
private $emailService;
public function processOrder(Order $order) {
// 只处理订单业务逻辑
$this->paymentGateway->charge($order->total);
$this->emailService->sendConfirmation($order);
}
}
// Repository层 - 数据访问
class OrderRepository {
public function save(Order $order) {
// 只处理数据库操作
return DB::table('orders')->insert($order->toArray());
}
}
接口与实现分离
// 接口定义
interface PaymentGateway {
public function charge($amount);
public function refund($transactionId);
}
// 具体实现
class StripePayment implements PaymentGateway {
public function charge($amount) {
// Stripe API逻辑
}
public function refund($transactionId) {
// 退款逻辑
}
}
class PayPalPayment implements PaymentGateway {
public function charge($amount) {
// PayPal API逻辑
}
public function refund($transactionId) {
// 退款逻辑
}
}
使用依赖注入解耦
class UserService {
private $repository;
private $logger;
// 依赖通过构造函数注入
public function __construct(
UserRepository $repository,
LoggerInterface $logger
) {
$this->repository = $repository;
$this->logger = $logger;
}
public function createUser($data) {
// 不需要关心具体的实现细节
$user = $this->repository->save($data);
$this->logger->info('User created: ' . $user->id);
return $user;
}
}
实际项目目录结构示例
project/
├── app/
│ ├── Controllers/ # 控制器
│ ├── Models/ # 数据模型
│ ├── Services/ # 业务服务
│ ├── Repositories/ # 数据仓库
│ └── Providers/ # 服务提供者
├── config/ # 配置
├── database/ # 数据库迁移
├── resources/ # 视图文件
├── routes/ # 路由
└── public/ # 入口文件
职责分离的好处
- 代码可维护性:修改一个功能不影响其他部分
- 可测试性:各部分可以独立测试
- 可扩展性:容易添加新功能
- 团队协作:多人可同时开发不同模块
- 代码复用:公共服务可以被多个控制器使用
这种分离方式让PHP应用更加健壮和易于维护。