在函式內宣告 global $var,讓函式內的 $var 參考全域同名變數。
<?php
$a = 12;
function fn() {
global $a; // 連結到全域 $a
$a += 12;
}
fn();
echo $a; // 24
?>
<?php
// 錯誤示範
global $a; // 全域範圍不需要、也無效
$a = 123;
function f() {
echo $a; // Notice: Undefined variable
}
?>
<?php
function f() {
global $a;
$a = 123;
}
f();
echo $a; // 123
?>
被引入檔案的程式碼繼承調用處的作用域。若在函式內 include,該檔案變數變成區域變數。
<?php
// A.php
function Test_Global() {
include 'B.php'; // 在函式內 include
Test();
}
$a = 0;
Test_Global();
echo $a; // 輸出 0(非預期的 1)
// B.php
function Test() {
global $a; // 連結到 Test_Global 的區域 $a,而非全域!
$a = 1;
}
?>
<?php
// A.php
include 'B.php'; // 移到函式外部
function Test_Global() {
Test();
}
$a = 0;
Test_Global();
echo $a; // 輸出 1
?>
不需 global 關鍵字,直接透過 $GLOBALS['var'] 存取全域變數,在任何作用域皆可用。
<?php
$a = 10;
function test() {
$GLOBALS['a'] = 20; // 直接修改全域
$GLOBALS['b'] = 30; // 建立新全域
}
test();
echo $a; // 20
echo $b; // 30
?>
函式內 static $var:保持值於多次呼叫間,僅初始化一次,僅在該函式可見。
<?php
function counter() {
static $count = 0;
$count++;
echo $count . '<br>';
}
counter(); // 1
counter(); // 2
counter(); // 3
?>
define/const)或配置檔。$GLOBALS 明確標示,而非隱式 global。global 只能用於簡單變數,不可用於 global $arr['key'] 或 global $obj->prop。| 類型 | 建立時機 | 銷毀時機 | 可見範圍 |
|---|---|---|---|
| 全域變數 | 腳本載入時 | 腳本結束 | 全域(函式需 global/$GLOBALS) |
| 區域變數 | 函式進入時 | 函式返回時 | 僅該函式內部 |
| 靜態變數 | 首次執行到宣告行 | 腳本結束 | 僅該函式內部 |
| 超全域 | 自動建立 | 腳本結束 | 任何地方 |
理解作用域規則,能避免許多難以追蹤的變數汙染與邏輯錯誤。