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

PHP 抽象類與接口實戰教學:從 Shape 到多態設計

     編輯:PHP 綜合知識

深入理解 PHP 抽象類與接口:以幾何圖形體系為例

抽象類與接口是面向對象設計中實現「契約式編程」與「多態」的核心機制。本文通過完整的幾何圖形層級結構,演示抽象類、抽象方法、實體類、接口的定義與協作,並展示運行結果。

核心概念速覽

  • 抽象方法:只有聲明無實現(以分號結尾),強制子類覆寫。
  • 抽象類:包含至少一個抽象方法的類,不可實例化,作為子類模板。
  • 接口:全抽象方法的類,使用 interface/implements,支持多實現。
  • 多態:父類類型變量引用子類對象,調用覆寫方法實現不同行為。

完整代碼實現

<?php
// 抽象根類
abstract class Shape {
    abstract function getArea(); // 抽象方法:計算面積
}

// 抽象子類:多邊形
abstract class Polygon extends Shape {
    abstract function getNumberOfSides(); // 抽象方法:邊數
}

// 實體類:三角形
class Triangle extends Polygon {
    public $base;
    public $height;
    public function getArea() {
        return ($this->base * $this->height) / 2;
    }
    public function getNumberOfSides() {
        return 3;
    }
}

// 實體類:矩形
class Rectangle extends Polygon {
    public $width;
    public $height;
    public function getArea() {
        return $this->width * $this->height;
    }
    public function getNumberOfSides() {
        return 4;
    }
}

// 實體類:圓形(直接繼承 Shape,非多邊形)
class Circle extends Shape {
    public $radius;
    public function getArea() {
        return pi() * $this->radius * $this->radius;
    }
}

// 普通類:顏色(無關繼承體系)
class Color {
    public $name;
}

// 構建對象集合
$myCollection = array();

$r = new Rectangle; $r->width = 5; $r->height = 7; $myCollection[] = $r;
$t = new Triangle; $t->base = 4; $t->height = 5; $myCollection[] = $t;
$c = new Circle; $c->radius = 3; $myCollection[] = $c;
$col = new Color; $col->name = "blue"; $myCollection[] = $col;

// 多態遍歷
foreach ($myCollection as $s) {
    if ($s instanceof Shape)    print("Area: " . $s->getArea() . "<br>\n");
    if ($s instanceof Polygon)  print("Sides: " . $s->getNumberOfSides() . "<br>\n");
    if ($s instanceof Color)    print("Color: " . $s->name . "<br>\n");
    print("<br>\n");
}
?>

運行結果

Area: 35
Sides: 4

Area: 10
Sides: 3

Area: 28.274333882308

Color: blue

設計要點解析

  1. 抽象根類 Shape 定義通用契約 getArea(),不關心具體實現。
  2. 中間抽象類 Polygon 擴展契約,增加 getNumberOfSides(),語義更精確。
  3. 實體類 必須實現所有繼承的抽象方法,否則仍為抽象類。
  4. Circle 直接繼承 Shape,不強迫實現無意義的 getNumberOfSides(),體現「接口隔離原則」。
  5. instanceof 判斷類型,安全調用特定方法,實現運行時多態。

抽象類 vs 接口:如何選擇?

本例中 Shape 作為抽象類更合適,因它代表核心領域概念;若為 Drawable、Serializable 等行為特徵,則用接口。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景推薦理由
需要提供部分默認實現抽象類可包含非抽象方法、屬性、構造函數
純行為契約、多實現、無狀態接口類可實現多個接口,解決單繼承限制
核心領域模型、層級穩定抽象類表達「是一種」關係,語義更強