首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 函數中 static 靜態變量深度解析

     編輯:PHP 相關知識

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
?>

輸出解析:

  1. 首次調用:$sapi 初始化為 "apache2handler",返回後遞增為 "apache2handles"
  2. 二次調用:$sapi 保持 "apache2handles",返回後遞增為 "apache2handlet"
  3. 三次調用:以此類推

二、標準範例:計數器

<?php
function test() {
    static $w3sky = 0;
    echo $w3sky;
    $w3sky++;
}

test(); // 0
test(); // 1
test(); // 2
?>

每次調用輸出當前值並遞增,**值在調用間持久保存**。

三、static vs global 對比

四、類靜態成員區別

本文討論的是**函數內靜態變量**,不同於類的 static 屬性/方法:

class Test {
    public static function a() {} // 類靜態方法
    public function b() {}        // 實例方法
}

$obj = new Test();
Test::a();   // 類調用靜態方法
$obj->a();   // 實例調用靜態方法(合法)
$obj->b();   // 實例調用實例方法

五、實戰應用場景

  1. 單例模式懶加載:
function getInstance() {
    static $instance = null;
    if ($instance === null) {
        $instance = new MyClass();
    }
    return $instance;
}
  1. 昂貴資源初始化一次(配置解析、數據庫連接、正則編譯):
function getConfig($key) {
    static $config = null;
    if ($config === null) {
        $config = parse_ini_file('/path/to/config.ini', true);
    }
    return $config[$key] ?? null;
}
  1. 遞歸函數狀態保持:避免全局變量污染

六、注意事項

  • 只能初始化為**字面量/常量**,不能用表達式:static $a = func(); // 錯誤
  • 引用賦值需謹慎:static $a = &$b; 可能導致不可預期行為
  • PHP 8.1+ 支持 static 返回類型聲明

函數內 static 是「不想用全局變量又需要持久狀態」的最佳方案,善用它能寫出更乾淨、封裝性更強的代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性static 區域變量global 全局變量
作用域僅限聲明函數內部全腳本可見(需 global $var 引入)
生命周期腳本運行全程腳本運行全程
命名衝突不衝突(每函數獨立)極易衝突
封裝性優(狀態內聚)差(全局污染)