核心差異速查
| 特性 | self | $this |
| 指向 | 類別本身(靜態) | 當前實例(動態) |
| 存取成員 | 靜態屬性、常量、靜態方法 | 實例屬性、實例方法 |
| 語法 | self::$prop、self::CONST、self::method() | $this->prop、$this->method() |
| 繼承行為 | 編譯期綁定定義類(除非用 static::) | 執行期綁定實際實例類別 |
| 可用範圍 | 靜態/非靜態方法均可 | 僅非靜態方法 |
程式碼對照
class A {
public static $s = 'A-static';
public $i = 'A-instance';
public function show() {
echo self::$s . ' | ' . $this->i; // 靜態 vs 實例
}
}
class B extends A {
public static $s = 'B-static';
public $i = 'B-instance';
}
$b = new B();
$b->show(); // 輸出:A-static | B-instance
// self::$s 綁定 A(定義處),$this->i 綁定 B(實例實際類別)
parent 結合示範
class Base {
public function __construct() { echo "Base construct\n"; }
}
class Child extends Base {
public function __construct() {
parent::__construct(); // 呼叫父類建構子
echo "Child construct\n";
}
public function demo() {
self::demoStatic(); // 類別靜態方法
}
public static function demoStatic() { echo "Static\n"; }
}
new Child();
// 輸出:
// Base construct
// Child construct
最佳實踐
- 需多態靜態呼叫 → 改用
static::method() (LSB)。
- 靜態方法中不可使用 $this,會拋錯誤。
- 常量、配置值、單例實例、快取池 → 歸屬
self::。
- 業務資料、狀態、依賴注入 → 歸屬
$this->。