首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 抽象類別 核心概念與實作範例:定義規範、強制實作與單一繼承限制

     編輯:PHP 綜合知識

抽象類別是物件導向設計中「定義契約、延遲實作」的關鍵工具。它無法被實例化,僅能被繼承,強制子類別實作特定方法,確保介面一致性。本文詳細說明語法規則、可見性限制、建構子傳遞與實戰範例。

核心定義與語法

<?php
abstract class Shape {
    // 抽象方法:只有宣告,沒有大括號與實作
    abstract protected function getArea();

    // 一般方法:可提供預設實作,子類別可選擇覆寫
    public function getDescription() {
        return "這是一個幾何形狀";
    }
}

// 錯誤示範:無法實例化抽象類別
// $shape = new Shape(); // Fatal error: Cannot instantiate abstract class
?>

四大核心規則

  1. 含抽象方法必宣告 abstract class:只要類別內有一個 abstract 方法,整個類別就必須標記為 abstract。
  2. 抽象方法不可有主體:以分號結尾,不含 { }。
  3. 子類別實作可見性 ≥ 父類別:父類別 protected → 子類別可為 protected 或 public,不可為 private。
  4. 參數簽章必須一致:子類別實作方法的參數個數、型別提示、預設值必須與抽象方法相符(PHP 7.0+ 支援协变/逆变,但建議保持一致)。

完整實作範例:幾何形狀體系

<?php
abstract class Shape {
    abstract protected function getArea(); // 強制子類實作

    // 範本方法:定義演算法骨架
    public function printInfo() {
        echo "面積:" . $this->getArea() . " | 描述:" . $this->getDescription() . "\n";
    }

    // 提供預設實作,子類可選擇覆寫
    protected function getDescription() {
        return "未知形狀";
    }
}

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

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

    // 實作抽象方法,可見性提升為 public
    public function getArea() {
        return $this->width * $this->height; // 修正原文錯誤:周長公式 → 面積公式
    }

    // 覆寫預設方法
    protected function getDescription() {
        return "矩形 (寬:{$this->width}, 高:{$this->height})";
    }
}

class Circle extends Shape {
    private $radius;

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

    public function getArea() {
        return pi() * $this->radius ** 2;
    }

    protected function getDescription() {
        return "圓形 (半徑:{$this->radius})";
    }
}

// 使用
$shapes = [new Rectangle(10, 5), new Circle(3)];
foreach ($shapes as $shape) {
    $shape->printInfo(); // 多型呼叫
}
// 輸出:
// 面積:50 | 描述:矩形 (寬:10, 高:5)
// 面積:28.274... | 描述:圓形 (半徑:3)
?>

抽象類別 vs 介面

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

常見設計模式應用

  • 範本方法模式:父類別定義演算法骨架 (final public function template()),子類別實作抽象步驟。
  • 工廠方法模式:抽象類別宣告 abstract protected function createProduct(),子類別決定具體產品類別。
  • 策略模式基底:定義演算法介面,配合介面使用更靈活。

注意事項與最佳實踐

  • 若子類別未實作所有抽象方法,該子類別也必須宣告為 abstract。
  • 抽象類別可定義建構子,子類別若覆寫建構子,記得呼叫 parent::__construct(...) 以完成父類別初始化。
  • 避免過度使用:單純定義契約請用 interface;需要共享程式碼、狀態時才用抽象類別。
  • PHP 單一繼承限制:一個類別只能 extends 一個父類別,但可 implements 多個介面 → 「單一繼承、多重介面」。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved