接口與抽象類是 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 獨有
abstractinterface 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();
}
implements 實現接口,**可同時實現多個**extends 繼承,可多重繼承| 維度 | 抽象類 | 接口 |
|---|---|---|
| 關鍵字 | abstract class | interface |
| 繼承/實現 | extends(單繼承) | implements(多實現) |
| 方法類型 | 抽象 + 具體 | 全部抽象(隱式) |
| 屬性支持 | 實例屬性、靜態屬性、常量 | 僅常量 |
| 構造函數 | 可定義 | 不可定義 |
| 訪問修飾符 | public/protected | 隱式 public |
| 核心語義 | "是一種" (is-a) 共享基因 | "能做什麼" (can-do) 定義契約 |
Animal → Mammal → DogSerializable, 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
}
記住:**抽象類定義骨架,接口定義能力**。靈活組合,構建清晰、可擴展的類層級結構。