介面 定義「物件必須擁有的公共操作契約」。只包含方法簽名,無方法主體、無成員變數。類別透過 implements 實作介面,強制實作所有方法。
interface I_Goods {
// 介面方法預設 public abstract,不可省略 public
public function sayName(): string;
public function sayPrice(): float;
}
// 實作介面
class Goods implements I_Goods {
private string $name;
private float $price;
public function __construct(string $name, float $price) {
$this->name = $name;
$this->price = $price;
}
public function sayName(): string {
return $this->name;
}
public function sayPrice(): float {
return $this->price;
}
}
PHP 單繼承、多實作。一個類別可同時實作多個介面,組合不同契約:
interface I_Goods {
public function sayName();
public function sayPrice();
}
interface I_Shop {
public function saySafe();
}
// 同時實作兩個介面
class Goods implements I_Goods, I_Shop {
public function sayName() { ... }
public function sayPrice() { ... }
public function saySafe() { ... }
}
介面可繼承介面,子介面擁有父介面所有契約:
interface I_Shop extends I_Goods {
public function saySafe();
}
// 實作 I_Shop 即須實作 sayName、sayPrice、saySafe 三方法
class ShopGoods implements I_Shop { ... }
介面可定義常量,實作類及外部可透過 ClassName::CONST 存取:
interface I_Goods {
public const PI = 3.14159;
public function sayName();
}
class Goods implements I_Goods {
public function sayName() { return '商品'; }
}
echo Goods::PI; // 3.14159
| 特性 | 介面 | 抽象類 |
|---|---|---|
| 多重實作/繼承 | 多實作 | 單繼承 |
| 方法主體 | 不可有(PHP 8.0+ 可有預設實作) | 可有 |
| 成員變數 | 不可有 | 可有 |
| 建構子 | 不可有 | 可有 |
| 適用場景 | 定義契約、跨層級組合行為 | 提供共用基礎實作、模板方法 |
interface Logger {
public function log(string $msg): void;
// 預設實作,實作類可選擇覆寫
public function info(string $msg): void {
$this->log('[INFO] ' . $msg);
}
}
I_ 前綴或 Interface 後綴(如 LoggerInterface)interface + trait 實現「契約 + 可複用實作」