<?php
/**
* 第一層:基礎抽象類,定義核心協議
*/
abstract class BaseService {
// 抽象方法:強制子類實現具體業務邏輯
abstract protected function execute(array $params): array;
// 普通方法:提供通用能力(模板方法)
public function handle(array $params): array {
$this->validate($params); // 1. 驗證
$result = $this->execute($params); // 2. 核心邏輯(延遲到子類)
$this->log($params, $result); // 3. 日誌
return $result;
}
// 受保護輔助方法
protected function validate(array $params) { /* ... */ }
protected function log(array $params, array $result) { /* ... */ }
}
/**
* 第二層:業務抽象類,進一步細分領域
*/
abstract class PaymentService extends BaseService {
// 新增抽象方法:支付特有的驗證
abstract protected function verifySignature(array $data): bool;
// 覆寫模板方法,插入支付驗證步驟
public function handle(array $params): array {
if (!$this->verifySignature($params)) {
throw new \Exception('簽名驗證失敗');
}
return parent::handle($params); // 調用父類模板
}
}
/**
* 第三層:具體實現類
*/
class AlipayService extends PaymentService {
protected function execute(array $params): array {
// 支付寶具體下單邏輯
return ['trade_no' => '20240101123456', 'status' => 'success'];
}
protected function verifySignature(array $data): bool {
// 支付寶簽名驗證算法
return true; // 簡化
}
}
// 使用
$service = new AlipayService();
$result = $service->handle(['amount' => 100, 'order_id' => 'A001']);
var_dump($result);
| 維度 | 抽象類 | 接口 |
|---|---|---|
| 代碼復用 | ✅ 可包含實現代碼 | ❌ 僅聲明(PHP 8.0+ 支持默認實現) |
| 狀態持有 | ✅ 可定義屬性 | ❌ 不可有屬性 |
| 繼承限制 | 單繼承 | 多實現 |
| 構造函數 | ✅ 可定義 | ❌ 無 |
| 適用場景 | 「是一種」關係,共享核心邏輯 | 「具有」能力,定義契約 |
抽象類定義算法骨架(handle()),將易變步驟延遲到子類(execute()、verifySignature())。這實現了好萊塢原則:「別調用我們,我們會調用你」。
private(子類不可見) → 必須是 public/protectedabstract → 致命錯誤