PHP 變數無需宣告,首次賦值即建立。作用域規則與 C/C++ 不同:函數內預設只能存取區域變數,全域變數需明確宣告。本文系統說明變數建立、四大作用域、global/$GLOBALS、static、超全域變數。
變數建立規則
- 以
$ 開頭,區分大小寫 ($var ≠ $Var)
- 首字元為字母或底線,後接字母數字底線
- 首次賦值即建立,型別由值決定
四大作用域
| 作用域 | 範圍 | 存取方式 |
| 區域 | 函數/方法內部 | 直接使用 $var |
| 全域 | 腳本最外層、include 檔案 | 函數內需 global $var 或 $GLOBALS['var'] |
| 靜態 | 函數內部,跨呼叫保持值 | static $var = 初值; |
| 超全域 | 任何位置 | 直接使用 $_GET, $_POST, $_SESSION 等 |
程式碼示範
<?php
$city = '北京'; // 全域變數
function printCity($name) {
echo "你最喜歡的城市是:$name<br>";
}
function cityA() {
$city = '廣州'; // 區域變數,遮蔽全域
printCity($city);
}
function cityB() {
$city = '深圳';
printCity($city);
}
function cityC() {
global $city; // 宣告使用全域 $city
printCity($city);
}
function counter() {
static $count = 0; // 僅初始化一次
$count++;
echo "呼叫次數: $count<br>";
}
cityA(); // 廣州
cityB(); // 深圳
cityC(); // 北京
counter(); // 1
counter(); // 2
counter(); // 3
// 超全域變數範例
echo "請求方法: {$_SERVER['REQUEST_METHOD']}<br>";
?>
global vs $GLOBALS
| 特性 | global $var | $GLOBALS['var'] |
| 語法 | 關鍵字宣告 | 陣列存取 |
| 可讀性 | 明確宣告意圖 | 隱含全域存取 |
| 動態變數名 | 不支援 | 支援 ($GLOBALS[$name]) |
| 效能 | 略快 (編譯期解析) | 極微差異 |
常見誤區
- 以為 include 檔案自動共享區域變數:include 只是插入程式碼,作用域不變。
- 在類別方法中用 global 存取屬性:應用
$this->property,global 僅用於腳本層級全域變數。
- static 變數會被繼承:靜態變數屬於函數本身,子類別覆寫方法會有獨立 static。
最佳實踐
- 儘量避免全域變數,改用依賴注入、單例、服務容器。
- 函數參數傳遞資料,而非仰賴全域狀態。
- 需跨請求持久化資料用 Session/Redis/資料庫,而非 static。
- 類別屬性用
private/protected/public 明確可見性。