萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 抽象類別 完整教學:定義、規則、應用範例

PHP Abstract Class 抽象類別深度解析

抽象類別是物件導向設計中定義「契約」與「共通行為」的關鍵機制。它無法被實例化,只能被繼承,強制子類別實作抽象方法,確保介面一致性。

定義語法

<?php
abstract class ClassName {
    // 抽象方法:只有宣告,無主體 (大括號)
    abstract protected function methodName($param1, $param2);

    // 也可包含具體方法 (非抽象)
    public function commonMethod() {
        echo '共通功能';
    }
}
?>

核心規則 (必須遵守)

  1. 含抽象方法必須宣告為 abstract class。
  2. 抽象方法不能有主體 (不寫 { })。
  3. 無法直接 new 抽象類別,只能被繼承。
  4. 子類別必須實作所有抽象方法,否則子類別也必須宣告為 abstract。
  5. 子類別實作方法的可視性必須 ≥ 抽象方法 (如 abstract protected → 子類別 public/protected,不可 private)。
  6. 子類別實作方法的參數個數、型別提示必須相容 (PHP 7.0+ 嚴格模式下更嚴格)。
  7. PHP 單一繼承:一個類別只能 extends 一個父類別 (抽象或具體);需多介面請用 implements。

應用範例:計算幾何圖形面積

<?php
abstract class Shape {
    // 契約:所有形狀必須能計算面積
    abstract protected function getArea(): float;

    // 共通方法:取得名稱
    public function getName(): string {
        return static::class; // 晚期靜態綁定,取得實際子類別名稱
    }
}

class Rectangle extends Shape {
    private float $width;
    private float $height;

    public function __construct(float $width, float $height) {
        $this->width = $width;
        $this->height = $height;
    }

    // 實作抽象方法
    protected function getArea(): float {
        return $this->width * $this->height;
    }
}

class Circle extends Shape {
    private float $radius;

    public function __construct(float $radius) {
        $this->radius = $radius;
    }

    protected function getArea(): float {
        return M_PI * $this->radius ** 2;
    }
}

// 使用
$shapes = [
    new Rectangle(10, 20),
    new Circle(5),
];

foreach ($shapes as $shape) {
    printf('%s 面積: %.2f', $shape->getName(), $shape->getArea()) . PHP_EOL;
}
// 輸出:
// Rectangle 面積: 200.00
// Circle 面積: 78.54
?>

抽象類別 vs 介面 比較

特性抽象類別介面
關鍵字abstract classinterface
方法主體可包含具體方法全部為抽象方法 (PHP 8.0 前)
屬性可定義屬性 (含 static)僅常數
建構子可定義 __construct不可
繼承/實作extends (單一)implements (多重)
適用場景「是一種」關係,共享程式碼與狀態「能做某事」契約,多型行為

設計建議

  • 當多個類別共享**核心邏輯/狀態**且具有「是一種」關係 → 用抽象類別。
  • 當只需定義**行為契約**、不涉及共享程式碼 → 用介面。
  • 可結合:抽象類別實作介面,提供部分預設實作,子類別再擴充。
  • 避免過度設計:小專案或簡單類別不必強行抽象,YAGNI 原則。
copyright © 萬盛學電腦網 all rights reserved