萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 介面與實作:interface、implements、多重實作、抽象類別實作介面

介面基本規則

  • 所有方法**必須是 public 抽象方法**(無主體)
  • 所有屬性**必須是常數** (const)
  • 不能有建構子、解構子、私有方法
  • 支援多重繼承 (interface A extends B, C)
  • 類別用 implements 實作,可同時實作多個介面

介面定義與繼承

interface Speaker {
    const VOLUME = 10;
    public function speak($message);
    public function shout($message);
}

interface Listener {
    public function listen();
}

interface Communicator extends Speaker, Listener {
    public function communicate($msg);
}

類別實作介面

class Human implements Communicator {
    public function speak($message) {
        echo "說:$message<br>";
    }
    public function shout($message) {
        echo "大喊:$message!!!<br>";
    }
    public function listen() {
        echo "正在聽...<br>";
    }
    public function communicate($msg) {
        $this->speak($msg);
        $this->listen();
    }
}

$h = new Human();
$h->communicate("Hello");
// 說:Hello
// 正在聽...

抽象類別實作介面 (部分實作)

abstract class BaseCommunicator implements Communicator {
    // 實作 speak,留 shout 給子類別
    public function speak($message) {
        echo "基礎說話:$message<br>";
    }
    // listen、communicate、shout 仍為抽象
}

class AdvancedHuman extends BaseCommunicator {
    public function shout($message) {
        echo "大聲:$message!!!<br>";
    }
    public function listen() {
        echo "專心聽講<br>";
    }
    public function communicate($msg) {
        $this->shout($msg);
        $this->listen();
    }
}

介面 vs 抽象類別 選擇指南

特性介面抽象類別
方法主體不可有 (PHP 8.0+ 可有 default)可有具體方法
屬性只能常數可有變數屬性
建構子不可有可有
繼承多重 implements單一 extends
用途定義契約/規範提供共用基礎實作

PHP 8.0+ 新功能:介面預設實作

interface Logger {
    public function log(string $message): void;
    
    // PHP 8.0+ 允許預設實作
    public function info(string $message): void {
        $this->log("[INFO] $message");
    }
    public function error(string $message): void {
        $this->log("[ERROR] $message");
    }
}

class FileLogger implements Logger {
    public function log(string $message): void {
        file_put_contents('app.log', $message . PHP_EOL, FILE_APPEND);
    }
    // 直接繼承 info()/error(),無需重寫
}

$logger = new FileLogger();
$logger->info("系統啟動"); // 自動加 [INFO] 前綴

實務設計模式應用

  • 策略模式:定義演算法介面,執行時切換實作
  • 依賴倒置:高層模組依賴介面,不依賴具體類別
  • 外掛系統:定義 Plugin 介面,第三方實作即可整合
copyright © 萬盛學電腦網 all rights reserved