萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP global 關鍵字與變數作用域深度解析

變數作用域基本規則

  • 全域作用域:函式/類別外部定義的變數。
  • 區域作用域:函式/方法內部定義的變數,函式結束即銷毀。
  • 預設隔離:函式內無法直接存取全域變數,全域也無法直接存取區域變數。

global 關鍵字

在函式內宣告 global $var,讓函式內的 $var 參考全域同名變數。

基本用法

<?php
$a = 12;

function fn() {
    global $a; // 連結到全域 $a
    $a += 12;
}

fn();
echo $a; // 24
?>

常見誤區:函式外宣告 global 無效

<?php
// 錯誤示範
global $a; // 全域範圍不需要、也無效
$a = 123;

function f() {
    echo $a; // Notice: Undefined variable
}
?>

正確:函式內宣告 global 並賦值,外部可用

<?php
function f() {
    global $a;
    $a = 123;
}
f();
echo $a; // 123
?>

include/require 的作用域陷阱

被引入檔案的程式碼繼承調用處的作用域。若在函式內 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;
}
?>

解決方案:將 include 移至全域

<?php
// A.php
include 'B.php'; // 移到函式外部

function Test_Global() {
    Test();
}
$a = 0;
Test_Global();
echo $a; // 輸出 1
?>

$GLOBALS 超全域陣列(替代方案)

不需 global 關鍵字,直接透過 $GLOBALS['var'] 存取全域變數,在任何作用域皆可用。

<?php
$a = 10;
function test() {
    $GLOBALS['a'] = 20; // 直接修改全域
    $GLOBALS['b'] = 30; // 建立新全域
}
test();
echo $a; // 20
echo $b; // 30
?>

靜態變數 static

函式內 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)
區域變數函式進入時函式返回時僅該函式內部
靜態變數首次執行到宣告行腳本結束僅該函式內部
超全域自動建立腳本結束任何地方

理解作用域規則,能避免許多難以追蹤的變數汙染與邏輯錯誤。

copyright © 萬盛學電腦網 all rights reserved