介面的核心價值在於「定義契約,而非實現」。本文透過一個支付場景範例,說明介面如何約束實現類必須提供特定方法,並讓調用端依賴抽象而非具體類。
<?php
interface Ipay {
function withmoney(); // 契約:必須實現現金支付
// function withinternet(); // 若註釋掉,實現類可選擇不實現
}
class Dmeng implements Ipay {
public function withmoney() {
echo "花人民幣買東西";
}
public function withinternet() {
return "用網銀支付";
}
}
?>
<?php
include_once 'pay.php';
class Main {
public function run($vc) {
$this->vc = $vc;
// 這裡只知道 $vc 實現了 Ipay,不關心具體類
$this->vc->withinternet(); // 若介面無此方法,此行會報錯
echo "yunxing";
}
}
$com = new Main();
$com->run(new Dmeng); // 注入實現類
?>
Ipay 中註釋掉 withinternet(),則 Dmeng 類無須實現該方法,但 Main::run() 呼叫時會報錯(介面未約束該方法)。implements Ipay,就**必須**實現介面中所有方法(PHP 會強制檢查)。Main) 僅依賴介面型別,可任意替換實現類(如換成 Alipay, WechatPay),實現開閉原則(OCP)。I 開頭或 Interface 結尾(如 Ipay, PaymentInterface)。interface 預設方法實現,減少樣板代碼,但謹慎使用以免稀釋契約語意。介面不是「多餘的代碼」,而是架構邊界的基石。善用介面,讓系統更靈活、可測試、可維護。