在 PHP 中,變量的作用域決定了變量在哪裡可見、哪裡可用。理解 local(局部)、global(全局)和 static(靜態)三種作用域,是編寫健壯、可維護代碼的基礎。本文通過具體代碼示例,深入剖析它們的行為差異與最佳實踐。
函數內部聲明的變量默認具有局部作用域,僅在該函數內有效。函數外部的同名變量互不影響。
function update_counter() {
$counter++; // 這裡的 $counter 是局部變量,與外部無關
}
$counter = 10;
update_counter();
echo $counter; // 輸出:10
因為函數內的 $counter 未初始化,遞增操作實際上是對未定義變量操作,並不會改變全局的 $counter。
若需在函數內訪問或修改全局變量,可使用 global 關鍵字或 $GLOBALS 超全局數組。
function update_counter() {
global $counter; // 引用全局變量
$counter++;
}
$counter = 10;
update_counter();
echo $counter; // 輸出:11
function update_counter() {
$GLOBALS['counter']++; // 通過超全局數組訪問
}
$counter = 10;
update_counter();
echo $counter; // 輸出:11
兩種方式效果相同,$GLOBALS 在某些情況下(如變量名動態確定)更靈活。
使用 static 關鍵字聲明的變量,雖然作用域仍為局部,但其值在函數調用之間保持不變,只初始化一次。
function update_counter() {
static $counter = 0; // 僅首次調用時初始化
$counter++;
echo "Static counter is now $counter\n";
}
$counter = 10; // 全局變量
update_counter(); // Static counter is now 1
update_counter(); // Static counter is now 2
echo "Global counter is $counter\n"; // Global counter is 10
靜態變量常用於記錄函數調用次數、緩存計算結果等場景,避免使用全局變量污染命名空間。
合理選擇作用域,能有效減少副作用,提高代碼的可讀性與可維護性。