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

PHP 靜態變量完整指南:作用域、生命週期與類/函數雙重場景實戰

     編輯:PHP 相關知識

static 關鍵字在 PHP 中有兩種截然不同的用法:函數內靜態局部變量 與 類靜態成員。前者讓變量在函數調用間「保持記憶」,後者實現「類級別共享狀態」。本文系統梳理兩者語法、訪問方式、典型應用場景與常見誤區。

一、函數內靜態局部變量

<?php
function counter() {
    static $count = 0; // 僅初始化一次
    $count++;
    echo "調用次數: $count\n";
}
counter(); // 1
counter(); // 2
counter(); // 3
// $count 只存在於 counter() 作用域,但生命週期贯穿整個腳本運行
  • 初始化:只在第一次調用時執行賦值,後續調用跳過。
  • 作用域:僅限函數內部,外部不可直接訪問。
  • 生命週期:請求/腳本結束前一直存在,不隨函數返回銷毀。
  • 典型用途:遞歸計數、緩存昂貴計算結果、單例模式內部標記。

二、類靜態成員

聲明與訪問

<?php
class Child {
    public static $nums = 0; // 靜態屬性
    public $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function join_game() {
        self::$nums++; // 類內訪問:self::$屬性
        echo "{$this->name} 加入遊戲\n";
    }
}

// 類外訪問:類名::$屬性
$c1 = new Child('李逵'); $c1->join_game();
$c2 = new Child('張飛'); $c2->join_game();
$c3 = new Child('唐僧'); $c3->join_game();
echo "總人數: " . Child::$nums; // 3

靜態方法

<?php
class Util {
    public static function greet(string $name): string {
        return "Hello, $name";
    }
}
echo Util::greet('PHP'); // 無需實例化

三、訪問方式對照表

位置靜態屬性靜態方法
類內部self::$prop / static::$prop (晚期靜態綁定)self::method() / static::method()
子類覆蓋parent::$propparent::method()
類外部ClassName::$propClassName::method()
實例對象$obj::$prop (可行但不推薦)$obj::method() (可行但不推薦)

四、晚期靜態綁定 (LSB) 關鍵差異

<?php
class A {
    public static function who() { echo __CLASS__; }
    public static function test() { self::who(); }    // 編譯期綁定 A
    public static function testLSB() { static::who(); } // 運行期綁定調用類
}
class B extends A {
    public static function who() { echo __CLASS__; }
}
A::test();     // A
B::test();     // A (self 綁定父類)
B::testLSB();  // B (static 綁定實際調用類 B)

五、常見誤區與最佳實踐

  1. 靜態 ≠ 全域:靜態變量有作用域限制,全域變量需 global 或 $GLOBALS。
  2. 避免濫用靜態屬性存儲請求級狀態:PHP 是共享無狀態架構,靜態屬性在 FPM/Worker 模式下會跨請求殘留,導致嚴重 Bug。請求級數據用依賴注入容器或 Session/Redis。
  3. 單例模式正確寫法:private static $instance; private function __construct(){} public static function getInstance(){ if(!self::$instance) self::$instance=new self; return self::$instance; }
  4. PHP 8.1+ readonly 靜態屬性:public static readonly string $VERSION = '1.0'; 確保不可變性。

理解靜態變量的「作用域 vs 生命週期」二維模型,能幫你在閉包緩存、單例、計數器、配置常量等場景寫出正確且高效的代碼。

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