static 關鍵字在函數內部聲明的變數具有「生命週期贏過作用域」的特性:僅在函數局部可見,但值在函數呼叫之間保持。本文說明語法、初始化限制與常見誤區。
<?php
function test() {
static $a = 0;
$a++;
echo $a;
}
test(); // 1
test(); // 2
test(); // 3
?>
輸出 1 2 3,證明 $a 的值在呼叫間保留。
<?php
function test() {
static $a = 0 + 1; // 錯誤:Parse error
static $b = sqrt(121); // 錯誤:Parse error
static $c = 10; // 正確
static $d = 'hello'; // 正確
}
?>
規則: static 變數初始化只能使用字面常量(整數、浮點數、字串、常量),不能使用函數呼叫、運算式或變數。這是 PHP 編譯期決定的靜態儲存分配機制所致。
static 變數只有一份,所有層級共享。static $var 在類別中屬於類別而非物件,透過 self::$var 或 ClassName::$var 存取。static:: 解決繼承中靜態方法/屬性的調用問題。static 能像全域變數一樣跨函數存取 → 錯誤,作用域仍限於函數內部。static $x = foo(); 初始化 → 編譯報錯。static 計數器 → 導致多次呼叫結果錯誤。善用 static 可實現函數級快取、計數器、單例模式等模式,但務必遵守初始化限制。