延遲靜態綁定:指類別中的 self 非以定義時類別為準,而是以實際執行時的呼叫類別為準。若使用 static:: 則會優先尋找子類別的方法,找不到再回溯父類別。
<?php
header("content-type:text/html;charset=utf-8");
class Human {
public static function hei() {
echo "我是父類的 hei() 方法";
}
public function say() {
// 子類別呼叫父類別 say() 時
self::hei(); // 此處調用父類別的 hei()
static::hei(); // 此處調用子類別的 hei(),若子類別不存在則回溯父類別
}
}
class Stu extends Human {
public static function hei() {
echo "我是子類的 hei() 方法";
}
}
$stu = new Stu();
$stu->say();
?>
$stu->say() 在 Human 類別內執行,故 self::hei() 綁定至 Human::hei()。static::hei() 採用延遲靜態綁定,優先在 Stu 尋找 hei(),找到則呼叫 Stu::hei();若 Stu 無此方法則回溯至 Human::hei()。| 關鍵字 | 綁定時機 | 查找順序 |
|---|---|---|
self:: | 編譯期(定義類別時) | 僅限當前定義的類別 |
static:: | 執行期(實際呼叫時) | 優先實際呼叫類別 → 父類別 |
當父類別定義流程骨架,需由子類別實作具體步驟(如 Template Method 模式)時,使用 static:: 可確保呼叫到子類別的實作方法。