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

PHP 抽象類與介面的概念差異與實作範例

     編輯:PHP 相關知識

抽象類與介面都是定義契約的機制,但語意、繼承規則、使用場景截然不同。本文對比兩者核心差異並給出標準實作範例。

抽象類

定義與規則

  • 關鍵字 abstract class。
  • 可包含抽象方法(無方法體)與具體方法。
  • 子類用 extends 繼承,**必須實現所有抽象方法**。
  • 不可直接實例化。
  • 單繼承:一個類只能繼承一個抽象類。
  • 方法可視性:子類實現時可視性必須 >= 抽象方法定義(如 protected → public 合法,反之非法)。

範例

<?php
abstract class Ku {
    abstract function kx(); // 抽象方法
    public function common() { echo "共用方法"; } // 具體方法
}
class Aa extends Ku {
    public function kx() { echo 'sdsf'; } // 必須實現
}
$aa = new Aa;
$aa->kx();
$aa->common();
?>

介面

定義與規則

  • 關鍵字 interface。
  • 所有方法隱含 public abstract,**不能有方法體**(PHP 8.0+ 允許預設實現,但傳統用法無)。
  • 類用 implements 實現,**必須實現介面中所有方法**(少一個都會報錯)。
  • 多實現:一個類可 implements 多個介面(用逗號分隔)。
  • 介面可繼承介面(interface B extends A)。

範例

<?php
interface Shop {
    public function buy($gid);
    public function sell($gid);
    public function view($gid); // abstract 可省略
}
class BaseShop implements Shop {
    public function buy($gid) { echo "購買商品 $gid"; }
    public function sell($gid) { echo "出售商品 $gid"; }
    public function view($gid) { echo "瀏覽商品 $gid"; }
}

// 多介面實現
interface Staff_i1 { function setID(); function getID(); }
interface Staff_i2 { function setName(); function getName(); }
class Staff implements Staff_i1, Staff_i2 {
    private $id, $name;
    public function setID($id) { $this->id = $id; }
    public function getID() { return $this->id; }
    public function setName($name) { $this->name = $name; }
    public function getName() { return $this->name; }
    public function otherFunc() { echo "Test"; } // 類自有方法
}
?>

核心差異總結

特性抽象類介面
方法實現可有具體方法全為抽象(傳統)
繼承/實現extends(單繼承)implements(多實現)
成員變數可定義屬性、常量只能定義常量
建構子可定義不能定義
語意「是一種」關係,共享基礎實現「能做什麼」契約,規範行為

選擇指南

  • 需要共享代碼、提供基礎實現 → 抽象類。
  • 定義行為規範、支援多型、解耦具體實現 → 介面。
  • 常見模式:介面定義契約,抽象類提供部分預設實現,具體類實現介面並繼承抽象類(或組合)。

理解兩者本質差異,能讓你的物件導向設計更清晰、擴展性更強。

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