一、核心概念先理清

  1. PHP 的繼承規則
  • 類(class):只能繼承 1 個父類(單繼承),如 class A extends B {},不能寫 class A extends B, C {}
  • 接口(interface):一個類可以實現多個接口(多實現),用逗號分隔,這就是 PHP 裏 “接口多繼承” 的本質;
  • 接口本身:還可以繼承多個其他接口(接口間的多繼承),進一步組合功能。

二、實現方式 1:類實現多個接口(最常用)

這是項目中最核心的 “多繼承” 落地方式,讓一個類同時擁有多個接口定義的規範。

完整代碼示例

php

 

運行

<?php
// 定義第一個接口:支付基礎能力
interface Payable {
    // 支付方法
    public function pay(float $amount): bool;
}

// 定義第二個接口:退款能力
interface Refundable {
    // 退款方法
    public function refund(float $amount): bool;
}

// 定義第三個接口:訂單查詢能力
interface Queryable {
    // 查詢訂單方法
    public function query(string $orderNo): array;
}

// 實現類:支付寶支付(同時實現3個接口)
class Alipay implements Payable, Refundable, Queryable {
    // 實現Payable的pay方法
    public function pay(float $amount): bool {
        echo "支付寶支付{$amount}元\n";
        return true;
    }

    // 實現Refundable的refund方法
    public function refund(float $amount): bool {
        echo "支付寶退款{$amount}元\n";
        return true;
    }

    // 實現Queryable的query方法
    public function query(string $orderNo): array {
        echo "查詢支付寶訂單{$orderNo}\n";
        return ['order_no' => $orderNo, 'status' => 'success'];
    }
}

// 測試調用
$alipay = new Alipay();
$alipay->pay(100.0);       // 輸出:支付寶支付100元
$alipay->refund(50.0);      // 輸出:支付寶退款50元
print_r($alipay->query('20251220001')); // 輸出訂單信息
?>

 

關鍵説明

  • 類實現多個接口時,必須實現所有接口的所有抽象方法,否則會報 Fatal Error;
  • 這種方式讓Alipay類同時具備了支付、退款、查詢三種能力,等價於 “繼承” 了多個接口的規範。

三、實現方式 2:接口繼承多個接口(接口組合)

先把多個接口的功能組合成一個新接口,再讓類實現這個組合接口,適合功能複用場景。

完整代碼示例

php

 

運行

 

<?php
// 基礎接口1:支付
interface Payable {
    public function pay(float $amount): bool;
}

// 基礎接口2:退款
interface Refundable {
    public function refund(float $amount): bool;
}

// 組合接口:繼承Payable和Refundable,形成“完整支付能力”接口
interface CompletePay extends Payable, Refundable {
    // 可新增專屬方法,也可僅組合父接口
    public function cancel(string $orderNo): bool;
}

// 實現類:微信支付(只需實現組合接口的所有方法)
class WechatPay implements CompletePay {
    // 實現Payable的pay
    public function pay(float $amount): bool {
        echo "微信支付{$amount}元\n";
        return true;
    }

    // 實現Refundable的refund
    public function refund(float $amount): bool {
        echo "微信退款{$amount}元\n";
        return true;
    }

    // 實現CompletePay的cancel
    public function cancel(string $orderNo): bool {
        echo "取消微信訂單{$orderNo}\n";
        return true;
    }
}

// 測試
$wechat = new WechatPay();
$wechat->pay(200.0);    // 輸出:微信支付200元
$wechat->cancel('20251220002'); // 輸出:取消微信訂單20251220002
?>

 

關鍵説明

  • 接口間的多繼承用extends(和類繼承語法一致),多個父接口用逗號分隔;
  • 組合接口的優勢:把分散的小接口整合為一個 “大接口”,類實現時更簡潔,也便於統一管理功能規範。

四、避坑注意事項

  1. 方法名衝突:如果多個接口定義了同名同參數的方法,類只需實現一次即可;如果同名但參數不同,PHP 會報錯(需保證方法簽名一致);
  2. 不要濫用多接口:接口越多,類的實現成本越高,需遵循 “單一職責”,一個類實現的接口不宜過多(建議 3 個以內);
  3. PHP 版本兼容:所有 PHP 版本(5.0+)都支持接口多實現 / 多繼承,無需擔心版本問題。

總結

  1. PHP 沒有真正的 “類多繼承”,但可通過類實現多個接口接口繼承多個接口實現等效的 “多繼承” 能力;
  2. 最常用的是 “類實現多個接口”,核心是讓類遵守多個規範、擁有多套能力;
  3. 接口組合(接口繼承接口)適合功能複用場景,能簡化類的實現邏輯,提升代碼整潔度。