首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 抽象類深度解析:定義規則、繼承鏈與實戰模板方法模式

     編輯:PHP 相關知識

抽象類核心規則

  1. 至少包含一個抽象方法(無方法體,僅聲明)
  2. 不能直接實例化,只能被繼承
  3. 可包含普通方法、屬性、常量、構造函數
  4. 子類必須實現所有抽象方法,除非子類也是抽象類
  5. 一個類只能繼承一個抽象類,但可實現多個接口

代碼示例:多層抽象繼承鏈

<?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);

抽象類 vs 接口:如何選擇?

維度抽象類接口
代碼復用✅ 可包含實現代碼❌ 僅聲明(PHP 8.0+ 支持默認實現)
狀態持有✅ 可定義屬性❌ 不可有屬性
繼承限制單繼承多實現
構造函數✅ 可定義❌ 無
適用場景「是一種」關係,共享核心邏輯「具有」能力,定義契約

最佳實踐:模板方法模式

抽象類定義算法骨架(handle()),將易變步驟延遲到子類(execute()、verifySignature())。這實現了好萊塢原則:「別調用我們,我們會調用你」。

常見錯誤

  • ❌ 抽象方法聲明為 private(子類不可見) → 必須是 public/protected
  • ❌ 子類未實現所有抽象方法卻未聲明 abstract → 致命錯誤
  • ❌ 濫用抽象類導致繼承鏈過深(>3層) → 組合優於繼承
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved