在 PHP 開發中,include 引入文件時的變量作用域經常讓開發者困惑。特別是在類的方法中引入文件時,被引入文件的變量域會發生什麼變化?本文通過實測代碼詳細分析這一行為,並展示如何使用 global 關鍵字提升變量到全局作用域。
測試包含兩個文件:1.php(主文件,定義類與調用)和 2.php(被引入文件,定義變量與函數)。
<?php
$g1 = 'g1';
class c {
function fun() {
include('2.php');
echo "\n-----in class fun---\n";
global $g1;
var_dump("$g1 => ", $g1, '$g2 => ', $g2, '$gg2 => ', $gg2);
echo "\n--------\n";
}
}
c::fun();
echo "\n--- in 1.php ----\n";
var_dump('$g1 => ', $g1, '$g2 => ', $g2, '$gg2 => ', $gg2);
echo "\n--- ----\n";
?>
<?php
$g2 = 'g2';
global $gg2; // 本環境下並非全局,需要提升
$gg2 = 'gg2';
function g2fun() {
global $g1, $g2, $gg2;
echo "\n--- in g2fun ----\n";
var_dump('$g1 => ', $g1, '$g2 => ', $g2, '$gg2 => ', $gg2);
echo "\n--- ----\n";
}
g2fun();
echo "\n--- in 2.php ----\n";
var_dump('$g1 => ', $g1, '$g2 => ', $g2, '$gg2 => ', $gg2);
echo "\n--- ----\n";
global $g1;
echo "\n--- in 2.php global----\n";
var_dump('$g1 => ', $g1, '$g2 => ', $g2, '$gg2 => ', $gg2);
echo "\n--- ----\n";
?>
輸出結果顯示:
g2fun 內部,$g1 可見(全局),$g2 為 NULL(局部),$gg2 可見(已用 global 提升)。2.php 頂層作用域,$g1 為 NULL,$g2 可見,$gg2 可見。2.php 使用 global $g1 後,$g1 變為可見。fun 內,三個變量均可見。1.php 頂層,$g1、$gg2 可見,$g2 為 NULL。global 關鍵字將變量提升到全局作用域,使其在類方法外部也可訪問。include 含有業務邏輯變量的文件,改用類屬性、依賴注入或自動加載機制。global 聲明需要共享的變量。