在 PHP 物件導向程式設計中,「延遲靜態綁定」是一項關鍵特性,它解決了繼承體系中靜態方法調用的經典難題。本文將通過實例深入剖析其運作原理、與 self 的差異,以及實際開發中的最佳實踐。
傳統上,self:: 會在定義該方法的類中解析靜態成員,這導致父類方法無法動態調用子類覆寫的靜態方法。PHP 5.3 引入的 static:: 關鍵字,則在「運行時」根據實際調用的類來解析,實現了真正的多態行為。
<?php
header("content-type:text/html;charset=utf-8");
class Human {
public static function hei() {
echo "我是父類的 hei() 方法";
}
public function say() {
self::hei(); // 始終調用 Human::hei()
static::hei(); // 根據實際物件類型動態調用
}
}
class Stu extends Human {
public static function hei() {
echo "我是子類的 hei() 方法";
}
}
$stu = new Stu();
$stu->say();
// 輸出:
// 我是父類的 hei() 方法
// 我是子類的 hei() 方法
?>
Human 類,忽略繼承關係。$stu 是 Stu 實例,則調用 Stu::hei();若子類未覆寫,則回溯至父類。延遲靜態綁定在以下場景極具價值:
find()、save() 等靜態方法,子類自動繫結至對應資料表。create() 靜態工廠方法,子類決定具體實例化邏輯。static:: 動態選擇子類實現的演算法。過度依賴靜態綁定可能導致代碼耦合度上升、難以單元測試。建議在明確需要「運行時多態」時使用,其他情況優先考慮依賴注入或介面契約。