static 關鍵字在函數內部聲明變量時,賦予其持久化生命周期與局部作用域的雙重特性:變量值在函數調用間保持,但不可在函數外部直接訪問。
一、核心機制演示
<?php
function sendHeader($num, $rtarr = null) {
static $sapi = null;
if ($sapi === null) {
$sapi = php_sapi_name(); // 僅首次調用執行
}
return $sapi++; // 後續調用遞增
}
echo sendHeader(1) . "<br>"; // apache2handler
echo sendHeader(2) . "<br>"; // apache2handles
echo sendHeader(3) . "<br>"; // apache2handlet
?>
輸出解析:
- 首次調用:
$sapi 初始化為 "apache2handler",返回後遞增為 "apache2handles"
- 二次調用:
$sapi 保持 "apache2handles",返回後遞增為 "apache2handlet"
- 三次調用:以此類推
二、標準範例:計數器
<?php
function test() {
static $w3sky = 0;
echo $w3sky;
$w3sky++;
}
test(); // 0
test(); // 1
test(); // 2
?>
每次調用輸出當前值並遞增,**值在調用間持久保存**。
三、static vs global 對比
| 特性 | static 區域變量 | global 全局變量 |
| 作用域 | 僅限聲明函數內部 | 全腳本可見(需 global $var 引入) |
| 生命周期 | 腳本運行全程 | 腳本運行全程 |
| 命名衝突 | 不衝突(每函數獨立) | 極易衝突 |
| 封裝性 | 優(狀態內聚) | 差(全局污染) |
四、類靜態成員區別
本文討論的是**函數內靜態變量**,不同於類的 static 屬性/方法:
class Test {
public static function a() {} // 類靜態方法
public function b() {} // 實例方法
}
$obj = new Test();
Test::a(); // 類調用靜態方法
$obj->a(); // 實例調用靜態方法(合法)
$obj->b(); // 實例調用實例方法
五、實戰應用場景
- 單例模式懶加載:
function getInstance() {
static $instance = null;
if ($instance === null) {
$instance = new MyClass();
}
return $instance;
}
- 昂貴資源初始化一次(配置解析、數據庫連接、正則編譯):
function getConfig($key) {
static $config = null;
if ($config === null) {
$config = parse_ini_file('/path/to/config.ini', true);
}
return $config[$key] ?? null;
}
- 遞歸函數狀態保持:避免全局變量污染
六、注意事項
- 只能初始化為**字面量/常量**,不能用表達式:
static $a = func(); // 錯誤
- 引用賦值需謹慎:
static $a = &$b; 可能導致不可預期行為
- PHP 8.1+ 支持
static 返回類型聲明
函數內 static 是「不想用全局變量又需要持久狀態」的最佳方案,善用它能寫出更乾淨、封裝性更強的代碼。
- 上一篇文章: PHP mktime() 日期轉時間戳與毫秒級處理詳解
- 下一篇文章: PHP 獲取超連結傳遞參數值完整指南($_GET、$_REQUEST)
Copyright ©
程式碼之家 All Rights Reserved