PHP 早期版本中,self:: 在繼承體系中存在限制:永遠解析為定義該方法的類,而非實際調用的子類。
class A {
public static function echoClass() { echo __CLASS__; }
public static function test() { self::echoClass(); }
}
class B extends A {
public static function echoClass() { echo __CLASS__; }
}
B::test(); // 輸出:A (預期為 B)
PHP 5.3 引入 static::,執行時才解析實際調用類:
class A {
public static function echoClass() { echo __CLASS__; }
public static function test() { static::echoClass(); } // 關鍵改動
}
class B extends A {
public static function echoClass() { echo __CLASS__; }
}
B::test(); // 輸出:B ✓
| 關鍵字 | 解析時機 | 繼承行為 |
|---|---|---|
self:: | 編譯/定義時 | 綁定定義類 |
static:: | 執行時 | 綁定實際調用類 |
$this 或 get_called_class()