萬盛學電腦網

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

PHP 變數完整指南:定義、型別、作用域與超全域變數

前言

變數是程式儲存與操作資料的基本單位。PHP 作為弱型別語言,變數使用靈活但也容易產生隱性 Bug。本文系統整理變數定義規則、資料型別、作用域、預定義超全域變數及最佳實踐。

變數定義規則

  • 以 $ 開頭,後接字母或底線,可包含字母、數字、底線:$name, _age, $user_name_1
  • 區分大小寫:$name ≠ $Name ≠ $NAME
  • 不可用數字開頭:$123abc (錯誤)
  • 慣例:駝峰式 $userName 或蛇形 $user_name,專案統一風格

PHP 八大資料型別

分類型別說明範例
純量型別bool布林值true, false
int整數(平台相關,通常 64-bit)42, -10, 0x1A, 0b101
float浮點數(雙精度)3.14, 1.2e3, .5
string字串(位元組序列)'hello', "world", <<
複合型別array有序映射(鍵值對)[1,2,3], ['a'=>1]
object類別實例new DateTime()
特殊型別resource外部資源參考fopen(), curl_init()
null無值null

PHP 8.1+ 新增:never 回傳型別(函數不會返回)、mixed 型別聯集。

型別轉換與嚴格模式

隱性轉換(Type Juggling)

<?php
$var = "10" + 5;      // 15 (string -> int)
$var = "10" . 5;      // "105" (int -> string)
$var = true + 1;      // 2 (bool -> int)
$var = "abc" + 1;     // 1 (非數字字串轉為 0) + Warning
?>

顯式轉型

<?php
$int   = (int) "10";       // 10
$float = (float) "3.14";   // 3.14
$str   = (string) 123;     // "123"
$bool  = (bool) 0;         // false
$arr   = (array) 'hello';  // ['hello']
$obj   = (object) ['a'=>1]; // stdClass Object
?>

嚴格模式(declare(strict_types=1))

<?php
// 檔案最頂端宣告(必須在第一行)
declare(strict_types=1);

function add(int $a, int $b): int {
    return $a + $b;
}

add(1, 2);     // 3
add(1.5, 2);   // TypeError: Argument must be int, float given
add("1", 2);   // TypeError: Argument must be int, string given
?>

嚴格模式僅影響函數呼叫與回傳值的型別檢查,不影響內部運算。

變數作用域

區域變數

<?php
$x = 10; // 全域

function test() {
    $x = 20; // 區域變數,與外部 $x 無關
    echo $x; // 20
}
test();
echo $x; // 10
?>

global 關鍵字

<?php
$x = 10;
function test() {
    global $x; // 宣告使用全域 $x
    $x = 20;
}
test();
echo $x; // 20
?>

靜態變數

<?php
function counter() {
    static $count = 0; // 僅初始化一次,保持狀態
    $count++;
    echo $count . ' ';
}
counter(); // 1
counter(); // 2
counter(); // 3
?>

超全域變數(Superglobals)

在所有作用域自動可用,無需 global 宣告:

變數用途安全性提醒
$GLOBALS所有全域變數的陣列慎用,增加耦合
$_SERVER伺服器與執行環境資訊部分來自客戶端(如 HTTP_*),不可信
$_GETURL 查詢字串參數直接用戶輸入,必須驗證/過濾
$_POSTPOST 請求主體參數直接用戶輸入,必須驗證/過濾
$_REQUEST$_GET + $_POST + $_COOKIE不建議使用,來源不明確
$_COOKIEHTTP Cookie客戶端可竄改,敏感資料勿存
$_FILES上傳檔案資訊['type']、['name'] 皆不可信
$_ENV環境變數伺服器端設定,相對可信
$_SESSIONSession 變數伺服器端儲存,相對安全

變數引用

<?php
$a = 10;
$b = &$a; // $b 是 $a 的別名(引用)
$b = 20;
echo $a; // 20

// 函數參數引用
function addPrefix(&$str, $prefix = 'Mr. ') {
    $str = $prefix . $str;
}
$name = 'John';
addPrefix($name);
echo $name; // Mr. John

// foreach 參考修改陣列元素
$nums = [1,2,3];
foreach ($nums as &$n) { $n *= 2; }
unset($n); // 重要:解除引用,避免後續誤用
print_r($nums); // [2,4,6]
?>

常用魔術常數(偽變數)

常數說明
__LINE__目前行號
__FILE__完整檔案路徑(已解析符號連結)
__DIR__檔案所在目錄(等同 dirname(__FILE__))
__FUNCTION__函數名稱(區分大小寫)
__CLASS__類別名稱(含命名空間)
__TRAIT__Trait 名稱
__METHOD__類別方法名稱
__NAMESPACE__目前命名空間名稱

最佳實踐總結

  1. 啟用嚴格模式:declare(strict_types=1) 放在每個 PHP 檔案最頂端。
  2. 型別宣告:函數參數、回傳值、類別屬性(PHP 7.4+)盡可能宣告型別。
  3. 避免全域變數:使用依賴注入、單例、服務容器傳遞相依性。
  4. 超全域變數視為「髒資料」:使用前必須驗證、過濾、轉型。
  5. 引用謹慎使用:主要用於大型陣列/物件避免複製、需修改原值時;foreach 後務必 unset()。
  6. 變數命名語意化:$userCount 優於 $cnt,$isActive 優於 $flag。

結語

掌握 PHP 變數機制,不只是語法記憶,更是理解弱型別語言的運作邏輯。善用嚴格模式、型別宣告、超全域變數防禦,能讓程式碼更健壯、更易重構、更少驚喜。

copyright © 萬盛學電腦網 all rights reserved