iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0
Modern Web

PHP 新手自學筆記系列 第 25

【Day25】 PHP 多型 (介面)

  • 分享至 

  • xImage
  •  

介面(interfacer)就像一個契約書,裡面規定了你要做什麼,但不管你要做什麼。

他和抽象類別差別在於 介面是完全規範,抽象類別可以部分是規範,部分可以實作。

把 介面想成你的上司(interface) 你是員工(class)

介面 = 老闆的規定
老闆(介面)說:「你必須每天做 報表、做 會議紀錄」
員工(實作介面的類別)可以自己決定怎麼做報表、怎麼做會議紀錄
重點:只規定要做什麼,不管怎麼做

要定義介面 要使用 interface前綴 , 且被介面規範的class 也要使用前綴implements 。

新手可能會有個想法就是 介面定義的是一整個檔案,這個想法是錯的。
介面定義的是想要被規範的class,所以只有想要被規範的class才要加前綴implements,因為介面只規範方法簽名,不能有任何程式碼(包含建構子),建構子都是寫在class裡面
實際看一下程式碼

<?php
// 定義介面 Worker
interface Worker {
    public function doTask();
}

// 不同類別實作 Worker 介面
class Developer implements Worker {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function doTask() {
        echo $this->name . " 寫程式<br>";
    }
}

class Designer implements Worker {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function doTask() {
        echo $this->name . " 設計畫面<br>";
    }
}

class Manager implements Worker {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function doTask() {
        echo $this->name . " 做報告與管理<br>";
    }
}

// 建立員工名單(多型)
$workers = [
    new Developer("Alice"),
    new Designer("Bob"),
    new Manager("Charlie")
];

// 多型呼叫
foreach ($workers as $worker) {
    $worker->doTask();  // 統一呼叫,不同類別執行不同行為
}
?>

說明:

介面 Worker 定義規範,每個實作此介面的類別都必須提供 doTask() 方法

多型概念: 定義不同類別,相同函式(doTask)->不同行為
Developer → 寫程式
Designer → 設計畫面
Manager → 做報告與管理

建構子初始化名字
同一個類別可以建立多個物件,每個物件的名字可透過建構子初始化

多型應用
$worker 型別統一為 Worker
foreach 可以統一呼叫,不用管物件實際是哪個類別

比喻:

老闆說「做任務」 → doTask()
Alice 是 Developer → 寫程式
Bob 是 Designer → 設計畫面
Charlie 是 Manager → 做報告
老闆用同一個指令(foreach + doTask()),每個人做不同事情 → 多型

這邊幫多型做個總結:

概念層面:不同類別可以有同名方法,但實作不同 → 「不同類別,不同行為」
應用層面:介面型別變數統一呼叫方法 → $worker->doTask()
多型的威力:增加新類別也不用改呼叫程式,統一管理


上一篇
【Day24】 PHP 多型 (抽象類別)
系列文
PHP 新手自學筆記25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言