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

PHP 變數作用域完整指南:區域、全域、靜態、超全域與實戰陷阱

     編輯:PHP 相關知識

變數作用域分類

類型可見範圍生命週期典型用途
超全域變數腳本任何位置、跨頁面(Session)請求期間 / Session 期間$GLOBALS, $_SERVER, $_POST, $_GET, $_COOKIE, $_SESSION, $_REQUEST, $_FILES, $_ENV
常數全域(僅限當前腳本及 include 檔案)腳本執行期間define() 定義的設定值
全域變數腳本全域,但函數內需 global 宣告腳本執行期間設定參數、共享資源
靜態變數僅限宣告的函數內部請求期間(跨函數呼叫保持值)遞迴計數、單例模式、快取
區域變數僅限宣告的函數/區塊內部函數執行期間暫存計算中間值

關鍵規則與範例

1. 函數內預設無法存取全域變數

$a = 1;
function Test() { echo $a; } // 無輸出,因 $a 為區域變數且未初始化
Test();

2. global 關鍵字引入全域變數

$url = "www.example.com";
function DisplayUrl() {
    global $url;
    echo $url; // 正常輸出
}
DisplayUrl();

3. $GLOBALS 超全域陣列替代 global

$a = 1; $b = 2;
function Sum() { $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b']; }
Sum(); echo $b; // 3

4. 靜態變數跨呼叫保持值

function Counter() {
    static $count = 0;
    echo $count++;
}
Counter(); // 0
Counter(); // 1
Counter(); // 2

5. 靜態變數在遞迴中的應用

function Recurse() {
    static $count = 0;
    $count++;
    echo $count;
    if ($count < 10) Recurse();
    $count--;
}
Recurse(); // 輸出 1 2 3 ... 10 9 ... 1

6. 靜態變數初始化限制

function Foo() {
    static $int = 0;        // 正確
    static $int = 1 + 2;    // 錯誤:運算式不允許
    static $int = sqrt(121); // 錯誤:函數呼叫不允許
}

7. 函數參數屬區域變數

函數簽名中的參數屬區域變數,函數結束即銷毀,外部不可存取。

超全域變數完整清單

  • $GLOBALS — 所有全域變數陣列
  • $_SERVER — 伺服器環境變數
  • $_POST — POST 表單資料
  • $_GET — URL 參數
  • $_COOKIE — Cookie 資料
  • $_FILES — 上傳檔案資訊
  • $_ENV — 環境變數
  • $_REQUEST — 合併 GET/POST/COOKIE
  • $_SESSION — Session 資料

常見陷阱與最佳實務

  1. 避免濫用 global:改用依賴注入、單例、或傳遞參數,降低耦合。
  2. 靜態變數非全域:PHP 無「全域靜態變數」,類別靜態屬性 static $var 僅在當前請求有效。
  3. include 檔案共享作用域:被 include 的檔案繼承呼叫處的作用域(函數內 include 則為函數作用域)。
  4. 超全域變數無需 global:直接在函數內使用 $_POST['key'] 即可。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved