他和抽象類別差別在於 介面是完全規範,抽象類別可以部分是規範,部分可以實作。
把 介面想成你的上司(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()
多型的威力:增加新類別也不用改呼叫程式,統一管理