在 PHP 專案中,當多個檔案透過 include 串聯載入時,常會遇到在深層檔案的函式內使用 global $var 無法存取最外層定義的全域變數。本文解析成因並提供最佳實踐解法。
<?php
// a.php
$aa = 1;
?>
// b.php
<?php
include 'a.php';
function show() {
global $aa;
var_dump($aa); // 輸出:NULL
}
show();
?>
明明在 a.php 定義了 $aa = 1,為何在 b.php 的函式中 global $aa 卻抓不到?
global $var 的作用是將當前腳本作用域的變數引入函式區域作用域。當透過多層 include 時,PHP 的作用域鏈結可能不如預期,導致「當前腳本作用域」並非定義變數的那個檔案層級,進而找不到目標變數。
$GLOBALS 是 PHP 內建的超全域變數,以關聯陣列形式儲存所有全域變數(鍵為變數名,值為變數值)。它不受作用域限制,在任何函式、類別、檔案層級都能直接存取。
<?php
// a.php - 使用 $GLOBALS 定義
$GLOBALS['aa'] = 1;
?>
// b.php
<?php
include 'a.php';
function show() {
// 直接存取 $GLOBALS,無需 global 關鍵字
var_dump($GLOBALS['aa']); // 輸出:int(1)
}
show();
?>
global 關鍵字的作用域解析機制。| 方案 | 優點 | 缺點 | 推薦度 |
|---|---|---|---|
$GLOBALS['var'] | 簡單、通用、效能好 | 語義上不如變數直觀 | ⭐⭐⭐⭐⭐ |
| 單例模式/註冊器模式 | 物件導向、可控制存取邏輯 | 程式碼較多、需實例化 | ⭐⭐⭐⭐ |
常數 define() | 唯讀、全域可見 | 無法修改、僅適用常數 | ⭐⭐⭐ |
| Session/Cache | 跨請求持久化 | 過重、非同請求共享 | ⭐⭐ |
$GLOBALS。$GLOBALS['APP_CONFIG'])避免鍵名衝突。Config::get('key') 靜態方法,內部使用 $GLOBALS,提升可維護性。