在閱讀開源項目(如 PHPWind)源碼時,常見到函數內部使用 static 關鍵字聲明變量。這與全局變量有異曲同工之妙,但作用域僅限於函數內部,且能在多次調用間保持值的持久化。本文通過實例深入解析其行為。
function sendHeader($num, $rtarr = null) {
static $sapi = null;
if ($sapi === null) {
$sapi = php_sapi_name();
}
return $sapi++;
}
echo sendHeader(1)."<br>";
echo sendHeader(2)."<br>";
echo sendHeader(3)."<br>";
apache2handler
apache2handles
apache2handlet
static $sapi = null; 在函數首次調用時初始化,後續調用將跳過初始化,直接使用上次保留的值。這異於普通局部變量(每次調用重新創建)與全局變量(全局可見)。
例中 $sapi++ 導致返回值每次遞增:首次返回 php_sapi_name() 結果(如 "apache2handler"),第二次在字符串末尾追加 "s",第三次追加 "t"。這演示了 static 變量跨調用保持狀態的能力。
| 特性 | static 變量 | global 變量 |
|---|---|---|
| 作用域 | 僅限聲明它的函數內部 | 全局範圍(需 global 關鍵字引入) |
| 生命週期 | 腳本執行期間持久存在 | 腳本執行期間持久存在 |
| 命名衝突 | 不同函數可同名互不干擾 | 全局唯一,易衝突 |
static 在函數內部提供了一種「有狀態的函數」能力,介於純函數與對象實例之間。善用它能簡化代碼,但需權衡可維護性與測試性。
摘自:zaric