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

PHP static 靜態變數特性與使用陷阱

     編輯:PHP 相關知識

static 關鍵字在函數內部聲明的變數具有「生命週期贏過作用域」的特性:僅在函數局部可見,但值在函數呼叫之間保持。本文說明語法、初始化限制與常見誤區。

基本範例

<?php
function test() {
    static $a = 0;
    $a++;
    echo $a;
}
test(); // 1
test(); // 2
test(); // 3
?>

輸出 1 2 3,證明 $a 的值在呼叫間保留。

初始化限制:只能用常量表達式

<?php
function test() {
    static $a = 0 + 1;      // 錯誤:Parse error
    static $b = sqrt(121);  // 錯誤:Parse error
    static $c = 10;         // 正確
    static $d = 'hello';    // 正確
}
?>

規則: static 變數初始化只能使用字面常量(整數、浮點數、字串、常量),不能使用函數呼叫、運算式或變數。這是 PHP 編譯期決定的靜態儲存分配機制所致。

進階特性

  • 遞迴函數共享同一實例:遞迴呼叫中 static 變數只有一份,所有層級共享。
  • 類別靜態成員:static $var 在類別中屬於類別而非物件,透過 self::$var 或 ClassName::$var 存取。
  • 晚期靜態綁定 (LSB):PHP 5.3+ static:: 解決繼承中靜態方法/屬性的調用問題。

常見誤區

  1. 以為 static 能像全域變數一樣跨函數存取 → 錯誤,作用域仍限於函數內部。
  2. 嘗試用 static $x = foo(); 初始化 → 編譯報錯。
  3. 在遞迴中忘記重置 static 計數器 → 導致多次呼叫結果錯誤。
  4. 善用 static 可實現函數級快取、計數器、單例模式等模式,但務必遵守初始化限制。

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