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

PHP 接口與抽象類深度對比:設計選型完全指南

     編輯:PHP 相關知識

接口與抽象類是 PHP 面向對象設計中定義規範的兩大基石。理解它們的異同、適用場景,是編寫可擴展、可維護代碼的關鍵。

抽象類 核心規範

abstract class Animal {
    protected $name;
    public $age = 0;

    // 普通方法(可被繼承/覆蓋)
    public function breathe() {
        echo "Breathing...\n";
    }

    // 抽象方法(強制子類實現)
    abstract protected function makeSound();
    abstract public function move();
}

// 繼承鏈示例
abstract class Mammal extends Animal {
    public function makeSound() { echo "Some sound\n"; }
    // move() 未實現,仍為抽象類
}

class Dog extends Mammal {
    public function move() { echo "Running on 4 legs\n"; }
    public function fetch() { echo "Fetching ball!\n"; }
}

$dog = new Dog();
$dog->breathe();   // 繼承自 Animal
$dog->makeSound(); // 實現於 Mammal
$dog->move();      // 實現於 Dog
$dog->fetch();     // Dog 獨有

關鍵規則

  • 含抽象方法的類**必須**聲明 abstract
  • 抽象類**不能實例化**
  • 子類必須實現**所有**父類抽象方法,否則子類也須為抽象類
  • 實現方法的訪問權限 **不能比父類更嚴格**(public > protected > private)
  • 抽象方法**不能為 private**

接口 核心規範

interface Flyable {
    const MAX_HEIGHT = 10000;
    public function fly();
    public function land();
}

interface Swimmable {
    public function swim();
}

// 類實現多接口
class Duck implements Flyable, Swimmable {
    public function fly() { echo "Flying at " . self::MAX_HEIGHT . "ft\n"; }
    public function land() { echo "Landing on water\n"; }
    public function swim() { echo "Swimming\n"; }
}

// 接口繼承
interface Migratory extends Flyable, Swimmable {
    public function migrate();
}

關鍵規則

  • 接口**只能包含**常量、公共方法聲明(PHP 8.0+ 支持私有方法實現)
  • **不能**定義屬性(實例變量)
  • 類用 implements 實現接口,**可同時實現多個**
  • 實現類必須實現接口**所有**方法,否須聲明為抽象類
  • 接口間用 extends 繼承,可多重繼承

異同對比總結表

維度抽象類接口
關鍵字abstract classinterface
繼承/實現extends(單繼承)implements(多實現)
方法類型抽象 + 具體全部抽象(隱式)
屬性支持實例屬性、靜態屬性、常量僅常量
構造函數可定義不可定義
訪問修飾符public/protected隱式 public
核心語義"是一種" (is-a) 共享基因"能做什麼" (can-do) 定義契約

選型決策指南

選擇抽象類當:

  • 需要**共享代碼**(通用邏輯、默認實現)
  • 需要**定義實例狀態**(屬性)
  • 關聯緊密的類族,如 Animal → Mammal → Dog
  • 想強制子類擁有某些核心方法,但允許可選覆蓋其他方法

選擇接口當:

  • 定義**跨層級、無關類**的共同行為(如 Serializable, Countable, Flyable)
  • 需要**多實現**組合能力(一個類同時 Flyable + Swimmable)
  • 只關心「能做什麼」,不關心「如何做」
  • 作為類型提示參數,解耦具體實現

最佳實踐:組合使用

// 核心領域模型用抽象類
abstract class PaymentGateway {
    protected $config;
    public function __construct(array $config) { $this->config = $config; }
    abstract public function charge($amount);
    protected function log($msg) { /* 共享日誌邏輯 */ }
}

// 能力擴展用接口
interface Refundable { public function refund($transactionId); }
interface Recurring { public function subscribe($planId); }

// 具體實現組合
class StripeGateway extends PaymentGateway implements Refundable, Recurring {
    public function charge($amount) { /* Stripe 邏輯 */ }
    public function refund($transactionId) { /* ... */ }
    public function subscribe($planId) { /* ... */ }
}

class PayPalGateway extends PaymentGateway implements Refundable {
    public function charge($amount) { /* PayPal 邏輯 */ }
    public function refund($transactionId) { /* ... */ }
    // 不支持 Recurring
}

記住:**抽象類定義骨架,接口定義能力**。靈活組合,構建清晰、可擴展的類層級結構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved