抽象類與介面都是定義契約的機制,但語意、繼承規則、使用場景截然不同。本文對比兩者核心差異並給出標準實作範例。
abstract class。extends 繼承,**必須實現所有抽象方法**。protected → public 合法,反之非法)。<?php
abstract class Ku {
abstract function kx(); // 抽象方法
public function common() { echo "共用方法"; } // 具體方法
}
class Aa extends Ku {
public function kx() { echo 'sdsf'; } // 必須實現
}
$aa = new Aa;
$aa->kx();
$aa->common();
?>
interface。public abstract,**不能有方法體**(PHP 8.0+ 允許預設實現,但傳統用法無)。implements 實現,**必須實現介面中所有方法**(少一個都會報錯)。implements 多個介面(用逗號分隔)。interface B extends A)。<?php
interface Shop {
public function buy($gid);
public function sell($gid);
public function view($gid); // abstract 可省略
}
class BaseShop implements Shop {
public function buy($gid) { echo "購買商品 $gid"; }
public function sell($gid) { echo "出售商品 $gid"; }
public function view($gid) { echo "瀏覽商品 $gid"; }
}
// 多介面實現
interface Staff_i1 { function setID(); function getID(); }
interface Staff_i2 { function setName(); function getName(); }
class Staff implements Staff_i1, Staff_i2 {
private $id, $name;
public function setID($id) { $this->id = $id; }
public function getID() { return $this->id; }
public function setName($name) { $this->name = $name; }
public function getName() { return $this->name; }
public function otherFunc() { echo "Test"; } // 類自有方法
}
?>
| 特性 | 抽象類 | 介面 |
|---|---|---|
| 方法實現 | 可有具體方法 | 全為抽象(傳統) |
| 繼承/實現 | extends(單繼承) | implements(多實現) |
| 成員變數 | 可定義屬性、常量 | 只能定義常量 |
| 建構子 | 可定義 | 不能定義 |
| 語意 | 「是一種」關係,共享基礎實現 | 「能做什麼」契約,規範行為 |
理解兩者本質差異,能讓你的物件導向設計更清晰、擴展性更強。