在類別方法中 include 檔案時,被引入檔案的變數作用域會變成該方法的區域作用域,而非全域。本文透過實測程式碼詳細展示變數可見性變化、global 關鍵字提升機制、函式內部與類別方法中的差異,避開常見陷阱。
<?php
// 1.php - 主程式
$g1 = 'g1';
class C {
public function fun() {
include('2.php');
echo "\n-----in class fun---\n";
global $g1;
var_dump('$g1 => ', $g1, '$g2 => ', $g2, '$gg2 => ', $gg2);
}
}
C::fun();
echo "\n--- in 1.php ----\n";
var_dump('$g1 => ', $g1, '$g2 => ', $g2, '$gg2 => ', $gg2);
<?php
// 2.php - 被 include 檔案
$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);
}
g2fun();
echo "\n--- in 2.php ----\n";
var_dump('$g1 => ', $g1, '$g2 => ', $g2, '$gg2 => ', $gg2);
global $g1; // 在 2.php 末尾提升 $g1 為全域
echo "\n--- in 2.php global----\n";
var_dump('$g1 => ', $g1, '$g2 => ', $g2, '$gg2 => ', $gg2);
--- in g2fun ----
$g1 => 'g1' // global 成功提升至全域
$g2 => NULL // $g2 在 2.php 頂層非 global,函式看不到
$gg2 => 'gg2' // $gg2 已在 2.php 頂層 global
--- in 2.php ----
$g1 => NULL // 2.php 頂層未 global $g1,無法見到 1.php 的 $g1
$g2 => 'g2' // 2.php 區域變數
$gg2 => 'gg2' // 已 global
--- in 2.php global----
$g1 => 'g1' // 末尾 global $g1 提升成功
$g2 => 'g2'
$gg2 => 'gg2'
-----in class fun---
$g1 => 'g1' // 類別方法中 global $g1 成功
$g2 => 'g2' // include 區域變數在方法內可見
$gg2 => 'gg2' // 全域變數可見
--- in 1.php ----
$g1 => 'g1'
$g2 => NULL // 1.php 看不到 2.php 的區域變數 $g2
$gg2 => 'gg2' // 全域變數可見
| 情境 | 變數作用域 | 說明 |
|---|---|---|
| 類別方法中 include | 方法區域作用域 | 被 include 程式碼視為方法內容,非全域 |
| include 檔案頂層變數 | 區域變數 | 預設不自動成為全域,需在 include 檔中 global $var |
| include 檔案中的函式 | 函式本地作用域 | 函式內需自行 global 才能存取外層變數 |
在 include 檔中 global $var | 提升至真正全域 | 對整個腳本執行期生效,包含主程式、其他 include |
require_once 載入類別/函式庫,或用 Composer 自動載入。global $var1, $var2;。$data = include 'config.php'; // config.php 回傳陣列global $var 在函式/方法內存取。$GLOBALS、$_GET、$_POST、$_SESSION 等在所有作用域可見,無需 global。$GLOBALS['var'] vs global $var: 前者直接存取全域陣列,後者建立區域別名指向全域變數。