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

狂飆 PHP 筆記:靜態變數與動態變數的生命週期差異解析

     編輯:PHP 相關知識

狂飆 PHP 筆記:靜態變數與動態變數的生命週期差異解析

在函式內部,變數預設為 動態 (區域) 變數:每次呼叫函式都會重新建立、初始化、銷毀。若需在多次呼叫間保持狀態,必須宣告為 靜態變數 (static)。本文以簡潔代碼對比兩者生命週期,並說明靜態變數的三大典型應用場景。

核心差異速覽

特性動態變數 (預設)靜態變數 (static)
儲存區堆疊資料段 / 靜態儲存區
初始化時機每次呼叫函式僅第一次呼叫執行初始化
銷毀時機函式返回時腳本結束 / 進程結束
值的保持不保持跨呼叫保持
作用域函式內部函式內部 (但生命週期全域)

代碼對比

<?php
function dynamicCounter() {
    $count = 0;          // 動態變數
    $count++;
    echo "動態: $count\n";
}

function staticCounter() {
    static $count = 0;   // 靜態變數
    $count++;
    echo "靜態: $count\n";
}

echo "--- 呼叫 3 次 dynamicCounter ---\n";
dynamicCounter(); // 1
dynamicCounter(); // 1
dynamicCounter(); // 1

echo "--- 呼叫 3 次 staticCounter ---\n";
staticCounter(); // 1
staticCounter(); // 2
staticCounter(); // 3
?>

靜態變數三大經典應用場景

  1. 函式級計數器 / 單例模式鍵值:不想用全域變數汙染命名空間,又需跨呼叫保持狀態。
    function getDbConnection() {
        static $pdo = null;
        if ($pdo === null) {
            $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
        }
        return $pdo;
    }
  2. 遞迴函式的快取 / 記憶化:避免重複計算。
    function fibonacci($n) {
        static $cache = [0 => 0, 1 => 1];
        if (isset($cache[$n])) return $cache[$n];
        return $cache[$n] = fibonacci($n-1) + fibonacci($n-2);
    }
  3. 一次性初始化資源 (配置載入、字型註冊、連線池建立):
    function loadConfig($file) {
        static $config = null;
        if ($config === null) {
            $config = parse_ini_file($file, true);
        }
        return $config;
    }

進階:類別靜態屬性 vs 函式靜態變數

特性函式 static $var類別 static $prop
可見性僅函式內部依 public/protected/private 控制
繼承行為無繼承概念父子類別共享同一儲存體 (Late Static Binding 影響存取)
初始化語法標量/陣列/常數表達式PHP 8.1+ 支援類型宣告與初始化

常見誤區

  • 以為 static 等於「常數」:靜態變數可修改,只是生命週期延長。
  • 在類別方法中用函式靜態變數實作單例:繼承時會共享同一實例,破壞單例意圖 → 應用類別靜態屬性 + private constructor。
  • 併發環境下競態條件:PHP 傳統單執行緒無此問題;Swoole/RoadRunner 等協程環境需自行加鎖或使用 SplFixedArray 等無鎖結構。

💡 一句話心法:函式裡的 static 讓區域變數擁有「全域生命週期、區域可見性」——用來做「只初始化一次、多次複用」的私有倉庫最合適。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved