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

PHP 介面 完整指南:定義、實作、多實作、介面繼承與常量

     編輯:PHP 綜合知識

介面概念

介面 定義「物件必須擁有的公共操作契約」。只包含方法簽名,無方法主體、無成員變數。類別透過 implements 實作介面,強制實作所有方法。

基本語法

interface I_Goods {
    // 介面方法預設 public abstract,不可省略 public
    public function sayName(): string;
    public function sayPrice(): float;
}

// 實作介面
class Goods implements I_Goods {
    private string $name;
    private float $price;

    public function __construct(string $name, float $price) {
        $this->name = $name;
        $this->price = $price;
    }

    public function sayName(): string {
        return $this->name;
    }

    public function sayPrice(): float {
        return $this->price;
    }
}

三大規則

  1. 介面方法必須為 public
  2. 介面不能包含成員變數(可包含常量)
  3. 介面方法不寫主體(隱含 abstract),實作類必須全部實作

多實作:介面的核心優勢

PHP 單繼承、多實作。一個類別可同時實作多個介面,組合不同契約:

interface I_Goods {
    public function sayName();
    public function sayPrice();
}

interface I_Shop {
    public function saySafe();
}

// 同時實作兩個介面
class Goods implements I_Goods, I_Shop {
    public function sayName() { ... }
    public function sayPrice() { ... }
    public function saySafe() { ... }
}

介面繼承

介面可繼承介面,子介面擁有父介面所有契約:

interface I_Shop extends I_Goods {
    public function saySafe();
}

// 實作 I_Shop 即須實作 sayName、sayPrice、saySafe 三方法
class ShopGoods implements I_Shop { ... }

介面常量

介面可定義常量,實作類及外部可透過 ClassName::CONST 存取:

interface I_Goods {
    public const PI = 3.14159;
    public function sayName();
}

class Goods implements I_Goods {
    public function sayName() { return '商品'; }
}

echo Goods::PI; // 3.14159

介面 vs 抽象類

特性介面抽象類
多重實作/繼承多實作單繼承
方法主體不可有(PHP 8.0+ 可有預設實作)可有
成員變數不可有可有
建構子不可有可有
適用場景定義契約、跨層級組合行為提供共用基礎實作、模板方法

PHP 8.0+ 新特性:介面預設實作

interface Logger {
    public function log(string $msg): void;

    // 預設實作,實作類可選擇覆寫
    public function info(string $msg): void {
        $this->log('[INFO] ' . $msg);
    }
}

最佳實踐

  • 命名慣例:I_ 前綴或 Interface 後綴(如 LoggerInterface)
  • 介面保持精小(單一職責),避免「胖介面」
  • 依賴介面而非具體類別(依賴倒置原則),便於測試與替換實作
  • 搭配 interface + trait 實現「契約 + 可複用實作」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved