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

PHP 物件導向程式設計 (OOP) 學習筆記 (一) - 抽象類別、介面、instanceof 與契約式設計

     編輯:PHP 綜合知識

PHP 5 完整支援抽象類別、介面與型別檢查,奠定契約式設計基礎。本文系統整理核心概念與實戰範例。

1. 抽象類別

  • 使用 abstract 關鍵字宣告。
  • 包含至少一個抽象方法即須宣告為抽象類別。
  • 無法直接實例化,必須被繼承。
  • 抽象方法僅宣告簽名 (參數、可見度),無主體。
  • 子類別必須實作所有抽象方法,可見度相同或更寬鬆。

範例:交通工具抽象類別

abstract class Car {
    abstract public function getMaxSpeed();
}

class Roadster extends Car {
    private $speed;
    public function setSpeed($speed = 0) { $this->speed = $speed; }
    public function getMaxSpeed() { return $this->speed; }
}

class Street {
    private $speedLimit;
    private $cars = [];
    public function __construct($limit = 200) { $this->speedLimit = $limit; }
    protected function isStreetLegal(Car $car) {
        return $car->getMaxSpeed() < $this->speedLimit;
    }
    public function addCar(Car $car) {
        if ($this->isStreetLegal($car)) {
            echo "The Car was allowed on the road.";
            $this->cars[] = $car;
        } else {
            echo "The Car is too fast and was not allowed on the road.";
        }
    }
}

$porsche = new Roadster();
$porsche->setSpeed(340);
$street = new Street(80);
$street->addCar($porsche); // 輸出: The Car is too fast...

2. 介面

  • 使用 interface 定義,所有方法隱含 public abstract。
  • 類別使用 implements 實作介面 (可實作多個)。
  • 介面可繼承介面 (extends)。
  • 可定義常數 (不可被覆寫)。
  • 慣例命名以 I 開頭 (如 ISpeedInfo)。

範例:介面與抽象類別結合

abstract class Car {
    abstract public function setSpeed($speed = 0);
}

interface ISpeedInfo {
    public function getMaxSpeed();
}

class Roadster extends Car implements ISpeedInfo {
    private $speed;
    public function setSpeed($speed = 0) { $this->speed = $speed; }
    public function getMaxSpeed() { return $this->speed; }
}

3. instanceof 型別檢查

$porsche = new Roadster();
var_dump($porsche instanceof Car);        // true (繼承)
var_dump($porsche instanceof ISpeedInfo); // true (實作)
var_dump($porsche instanceof Roadster);   // true (本身)

用途:確認物件型別、父類別關係、介面實作。

4. 契約式設計

Design by Contract (DbC):在實作類別前先定義介面契約,包含先驗條件、後驗條件與不變式。優點:

  • 強制封裝與介面一致性。
  • 團隊協作時,介面即文件,降低溝通成本。
  • 支援多實作切換 (如不同資料庫驅動)。

5. 關鍵差異總結

特性抽象類別介面
關鍵字abstract classinterface
繼承關鍵字extendsimplements
多重繼承單一繼承可實作多個
方法主體可包含具體方法全為抽象 (PHP 8 前)
屬性可定義屬性僅常數
建構子可定義不可定義

6. PHP 不支援多重繼承,但可實作多介面達到類似效果

這是 PHP 設計選擇,介面提供了更安全的組合方式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved