| 特性 | 抽象類 (abstract class) | 介面 (interface) |
|---|---|---|
| 關鍵字 | extends | implements |
| 繼承關係 | 單繼承 | 多實現 |
| 成員變量 | 支援所有可见性、靜態、常量 | 僅支援常量 (隱式 public static final) |
| 構造函數 | 可定義 | 不可定義 |
| 方法預設可见性 | 可為 private/protected/public | 隱式 public |
| 方法實現 | 可包含具體實現 | PHP 8.0 前純聲明,8.0+ 支援預設實現 |
name = $name;
self::$count++;
}
public function breathe() { echo "{$this->name} 呼吸中...\n"; } // 具體實現
abstract public function sound(); // 強制子類實現
}
class Dog extends Animal {
public function sound() { echo "{$this->name}: 汪汪!\n"; }
}
$dog = new Dog('旺財');
$dog->breathe();
$dog->sound();
echo Animal::TYPE; // 存取常量
Dog is Animal)Flyable, Serializable)default 方法,或抽象類interface RepositoryInterface {
public function find($id);
public function save(Entity $e);
}
abstract class BaseRepository implements RepositoryInterface {
protected $pdo;
public function __construct(PDO $pdo) { $this->pdo = $pdo; }
// 通用邏輯:事務、事件分發、日誌
public function save(Entity $e) {
$this->pdo->beginTransaction();
try {
$this->doSave($e);
$this->pdo->commit();
} catch (\Throwable $ex) {
$this->pdo->rollBack();
throw $ex;
}
}
abstract protected function doSave(Entity $e); // 子類實現具體 SQL
}
class UserRepository extends BaseRepository {
protected function doSave(Entity $e) { /* user 表具體邏輯 */ }
}
「介面定義契約,抽象類提供骨架,具體類填充細節」—— 這是 PHP 面向對象設計的黃金分層。
final class + private __construct()implements 後必須實現所有方法:若類聲明 abstract 可延遲實現理解語法邊界與設計意圖,才能在「繼承複用」與「組合契約」間做出正確架構決策,避免「為了用介面而用介面」的過度設計。