在 PHP 中,global 關鍵字用於在函數內部引用全局作用域的變量。許多初學者認為只要在函數中聲明 global $var,就能直接訪問外部同名變量。然而,當涉及 include 或 require 等文件包含操作時,變量作用域會發生微妙變化,導致 global 失效。
假設有兩個文件 a.php 和 b.php:
<?php
$site_name = 'CodePlayer';
function sayHi() {
global $site_name;
echo "Hello! Welcome to $site_name !";
}
?>
<?php
function include_view_page() {
include 'b.php';
sayHi();
}
include_view_page();
?>
預期輸出:Hello! Welcome to CodePlayer !
實際輸出:Hello! Welcome to !
當 a.php 的 include_view_page() 函數包含 b.php 時,b.php 中的 $site_name 實際上變成了 include_view_page() 函數內部的局部變量。此時在 sayHi() 中使用 global $site_name,引用的是腳本全局作用域的 $site_name,而非 include_view_page() 內的局部變量,因此無法獲取正確值。
<?php
// b.php
global $site_name;
$site_name = 'CodePlayer';
function sayHi() {
global $site_name;
echo "Hello! Welcome to $site_name !";
}
?>
盡量減少多層嵌套的包含調用,將文件包含在全局作用域進行。
另一個常見困惑是 global $var 與 $GLOBALS['var'] 的區別:
<?php
$var1 = "#####";
$var2 = "&&&&&";
function global_references($use_globals) {
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // 僅函數內部可見
} else {
$GLOBALS["var2"] =& $var1; // 全局範圍可見
}
}
global_references(false);
echo "var2 is set to '$var2<br/>"; // 輸出 &&&&&
global_references(true);
echo "var2 is set to '$var2<br/>"; // 輸出 #####
?>
global 建立的是函數內部到全局變量的引用別名,而 $GLOBALS 直接操作全局符號表,影響範圍更廣。
$GLOBALS['var'] 明確訪問全局變量error_reporting(E_ALL) 以便發現未定義變量