基本定義
| 關鍵字 | 說明 | 作用域 |
| global | 在函數內聲明使用全局變量,創建**別名引用** | 函數內部 |
| $GLOBALS | 超全局數組,直接映射全局符號表,任何位置可訪問 | 全局(所有作用域) |
global 基本用法
<?php
$a = 123;
function foo() {
global $a; // 聲明使用全局 $a
echo $a; // 123
}
foo();
// 函數外聲明 global 無效
global $b; // Parse error(僅函數內合法)
$b = 456;
function bar() { echo $b; } // Notice: Undefined variable
bar();
global 寫入效果
function setGlobal() {
global $x;
$x = 789;
}
setGlobal();
echo $x; // 789 —— 修改生效,因為別名指向同一內存
$GLOBALS 基本用法
<?php
$x = 1; $y = 2;
function sum() {
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
sum();
echo $z; // 3
// 超全局特性:無需 global 聲明,函數/類/任意作用域直接用
function testSuper() {
echo $_POST['name']; // 直接可用
echo $GLOBALS['config']; // 直接可用
}
常見誤區
- 以為 global 變量「全局可見」:實際上
global $a 只在**當前函數**有效,其他函數需各自聲明。
- 以為 global 能跨文件自動生效:需先
include 定義變量的文件,再在函數中 global。
- 濫用 global 共享狀態:導致耦合度極高、難以測試、併發下競態條件。
- 混淆 global 與 static:
static $x 是函數級靜態變量,跨調用保持值,不關乎全局。
global 實現原理:別名綁定
function test() {
global $a; // 符號表:$a → ref→全局$a
$a = 10; // 修改內存值,全局生效
$a =& $other; // 重綁定:局部$a指向$other,全局$a斷開
unset($a); // 僅銷毀局部別名,全局$a存活
}
對比總結表
| 場景 | global | $GLOBALS |
| 讀取全局值 | ✅ | ✅ |
| 修改全局值(普通賦值) | ✅ | ✅ |
| 引用重綁(=&)影響全局 | ❌ 仅局部 | ✅ 全局生效 |
| unset 影響全局 | ❌ 仅局部 | ✅ 真正刪除 |
| 類方法中使用 | 需聲明 | 直接用 |
| 靜態分析友好度 | 低(動態別名) | 高(數組訪問) |
下篇預告
深入剖析引用重綁陷阱、unset 行為差異、實戰 Bug 案例,並給出「去全局化」重構路徑。