理解 PHP 變數作用域是寫出可維護代碼的關鍵。本文系統梳理超級全域變數、常數、全域/區域/靜態變數的差異與陷阱。
| 類型 | 可見範圍 | 生命週期 | 典型用途 |
|---|---|---|---|
| 超級全域變數 | 全腳本、跨檔案 | 請求期間 | 輸入處理、Session、環境資訊 |
| 常數 | 全腳本(含 include) | 腳本執行期間 | 配置值、狀態碼、固定參數 |
| 全域變數 | 宣告腳本全域(函式外) | 腳本執行期間 | 共享狀態(慎用) |
| 區域變數 | 函式/方法內部 | 函式執行期間 | 暫存計算、參數處理 |
| 靜態變數 | 函式內部 | 請求期間(跨呼叫保持) | 遞歸計數、單例模式、快取 |
| 類屬性 | 依 visibility 而定 | 物件生命週期 | OOP 狀態封裝 |
$x = 10;
function foo() {
echo $x; // Notice: Undefined variable
}
foo();
解法:global $x; 或 $GLOBALS['x'](不推薦濫用)。
global 建立別名而非複製function bar() {
global $x;
$x = 20; // 修改外部變數
}
function counter() {
static $count = 0;
return ++$count;
}
echo counter(); // 1
echo counter(); // 2
被引入檔案共享呼叫者的作用域,函式內 include 仍受函式作用域限制。
$GLOBALS:所有全域變數陣列$_SERVER:伺服器/執行環境資訊$_GET、$_POST:HTTP 參數$_COOKIE:Cookie 資料$_FILES:上傳檔案資訊$_ENV:環境變數$_REQUEST:合併 GET/POST/COOKIE(順序受 request_order 影響)$_SESSION:Session 資料bool、int、float、string,不支援 resource/array/object$ 前綴,慣例全大寫define() 可動態定義,const 僅限編譯期(類常數除外).env + vlucas/phpdotenv 管理$_GET/$_POST,避免用 $_REQUEST