變數是程式儲存與操作資料的基本單位。PHP 作為弱型別語言,變數使用靈活但也容易產生隱性 Bug。本文系統整理變數定義規則、資料型別、作用域、預定義超全域變數及最佳實踐。
$ 開頭,後接字母或底線,可包含字母、數字、底線:$name, _age, $user_name_1$name ≠ $Name ≠ $NAME$123abc (錯誤)$userName 或蛇形 $user_name,專案統一風格| 分類 | 型別 | 說明 | 範例 |
|---|---|---|---|
| 純量型別 | 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 型別聯集。
<?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
?>
<?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
?>
<?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
?>
在所有作用域自動可用,無需 global 宣告:
| 變數 | 用途 | 安全性提醒 |
|---|---|---|
$GLOBALS | 所有全域變數的陣列 | 慎用,增加耦合 |
$_SERVER | 伺服器與執行環境資訊 | 部分來自客戶端(如 HTTP_*),不可信 |
$_GET | URL 查詢字串參數 | 直接用戶輸入,必須驗證/過濾 |
$_POST | POST 請求主體參數 | 直接用戶輸入,必須驗證/過濾 |
$_REQUEST | $_GET + $_POST + $_COOKIE | 不建議使用,來源不明確 |
$_COOKIE | HTTP Cookie | 客戶端可竄改,敏感資料勿存 |
$_FILES | 上傳檔案資訊 | ['type']、['name'] 皆不可信 |
$_ENV | 環境變數 | 伺服器端設定,相對可信 |
$_SESSION | Session 變數 | 伺服器端儲存,相對安全 |
<?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__ | 目前命名空間名稱 |
declare(strict_types=1) 放在每個 PHP 檔案最頂端。foreach 後務必 unset()。$userCount 優於 $cnt,$isActive 優於 $flag。掌握 PHP 變數機制,不只是語法記憶,更是理解弱型別語言的運作邏輯。善用嚴格模式、型別宣告、超全域變數防禦,能讓程式碼更健壯、更易重構、更少驚喜。