PHP 5 引入 interface 與 implements 關鍵字,提供類似 Java 的介面機制,實現「多重繼承」效果,是物件導向設計中達成高內聚、低耦合的關鍵工具。
介面使用 interface 關鍵字宣告,方法預設為 public 且不可有方法主體:
<?php
interface One {
// 介面常數
const CONSTANT = 'constant value';
// 抽象方法(預設 public abstract)
public function fun1();
public function fun2();
}
?>
關鍵限制:
private/protected 可見度介面可繼承多個介面,類別可實現多個介面:
<?php
// 介面繼承介面
interface Two extends One {
function fun3();
function fun4();
}
// 類別實現多個介面
class Four implements One, Two {
public function fun1() { /* 實作 */ }
public function fun2() { /* 實作 */ }
public function fun3() { /* 實作 */ }
public function fun4() { /* 實作 */ }
}
// 同時繼承類別並實現介面(先 extends 再 implements)
class Five extends BaseClass implements One, Two {
// 必須實現所有介面方法
}
?>
展示介面如何解耦「主板」與「顯示卡」實作:
<?php
// VideoCard.php - 介面定義
interface VideoCardInter {
public function Display();
public function getName();
}
?>
<?php
// Dmeng.php - 具體實作
include_once("VideoCard.php");
class Dmeng implements VideoCardInter {
public function Display() {
echo "Display";
}
public function getName() {
return "Dmeng VideoCard";
}
}
?>
<?php
// Mainboard.php - 使用介面
include_once("VideoCard.php");
include_once("Dmeng.php");
class Mainboard {
private $vc;
// 型別提示:參數必須實現 VideoCardInter
public function run(VideoCardInter $vc) {
$this->vc = $vc;
$this->vc->Display();
echo "主板運行!";
}
}
$computer = new Mainboard();
$computer->run(new Dmeng); // 可替換為任何實現介面的廠牌
?>
作者總結的實務架構模式:
NewsInterface 定義新聞模組規範NewsInterfaceImpl 具體業務邏輯News 對外服務入口,組合上述元件此模式體現「依賴倒轉原則」,高層模組不依賴低層實作,皆依賴抽象介面。