介面基本規則
- 所有方法**必須是 public 抽象方法**(無主體)
- 所有屬性**必須是常數** (
const)
- 不能有建構子、解構子、私有方法
- 支援多重繼承 (
interface A extends B, C)
- 類別用
implements 實作,可同時實作多個介面
介面定義與繼承
interface Speaker {
const VOLUME = 10;
public function speak($message);
public function shout($message);
}
interface Listener {
public function listen();
}
interface Communicator extends Speaker, Listener {
public function communicate($msg);
}
類別實作介面
class Human implements Communicator {
public function speak($message) {
echo "說:$message<br>";
}
public function shout($message) {
echo "大喊:$message!!!<br>";
}
public function listen() {
echo "正在聽...<br>";
}
public function communicate($msg) {
$this->speak($msg);
$this->listen();
}
}
$h = new Human();
$h->communicate("Hello");
// 說:Hello
// 正在聽...
抽象類別實作介面 (部分實作)
abstract class BaseCommunicator implements Communicator {
// 實作 speak,留 shout 給子類別
public function speak($message) {
echo "基礎說話:$message<br>";
}
// listen、communicate、shout 仍為抽象
}
class AdvancedHuman extends BaseCommunicator {
public function shout($message) {
echo "大聲:$message!!!<br>";
}
public function listen() {
echo "專心聽講<br>";
}
public function communicate($msg) {
$this->shout($msg);
$this->listen();
}
}
介面 vs 抽象類別 選擇指南
| 特性 | 介面 | 抽象類別 |
| 方法主體 | 不可有 (PHP 8.0+ 可有 default) | 可有具體方法 |
| 屬性 | 只能常數 | 可有變數屬性 |
| 建構子 | 不可有 | 可有 |
| 繼承 | 多重 implements | 單一 extends |
| 用途 | 定義契約/規範 | 提供共用基礎實作 |
PHP 8.0+ 新功能:介面預設實作
interface Logger {
public function log(string $message): void;
// PHP 8.0+ 允許預設實作
public function info(string $message): void {
$this->log("[INFO] $message");
}
public function error(string $message): void {
$this->log("[ERROR] $message");
}
}
class FileLogger implements Logger {
public function log(string $message): void {
file_put_contents('app.log', $message . PHP_EOL, FILE_APPEND);
}
// 直接繼承 info()/error(),無需重寫
}
$logger = new FileLogger();
$logger->info("系統啟動"); // 自動加 [INFO] 前綴
實務設計模式應用
- 策略模式:定義演算法介面,執行時切換實作
- 依賴倒置:高層模組依賴介面,不依賴具體類別
- 外掛系統:定義 Plugin 介面,第三方實作即可整合