| 範圍 | 存取方式 | 生命週期 |
| 區域 (函數/方法內) | 直接使用 | 函數結束銷毀 |
| 全域 | global $var 或 $GLOBALS['var'] | 腳本結束銷毀 |
| 靜態區域 | static $var = 0; | 跨呼叫保持值,僅初始化一次 |
| 超全域 | $_GET, $_POST, $_SESSION, $_COOKIE, $_SERVER, $_ENV, $_FILES, $GLOBALS | 全腳本任意位置可存取,自動全域 |
變數的變數 (Variable Variables)
<?php
$var = 'name';
$$var = 'John'; // 等同 $name = 'John';
echo $name; // John
// 陣列鍵名動態
$key = 'user_name';
$$key = 'Alice'; // $user_name = 'Alice'
// 結合解構 (PHP 8.0+)
[$$key] = ['Bob']; // $user_name = 'Bob'
慎用:降低可讀性、靜態分析困難、安全風險 (用戶輸入控制變數名)。現代框架極少使用。
PHP 外部變數來源
- HTTP 請求:
$_GET (查詢字串)、$_POST (表單 POST)、$_REQUEST (合併 G/P/C,**不推薦使用**、順序依 request_order 設定)。
- 檔案上傳:
$_FILES。
- 環境/伺服器:
$_SERVER (含 REQUEST_URI, HTTP_USER_AGENT 等)、$_ENV。
- Session:
$_SESSION (需 session_start())。
最佳實踐清單
- 嚴格型別模式:檔案頂端
declare(strict_types=1);。
- 型別宣告:函數參數、回傳值、類別屬性 (PHP 7.4+) 全部加型別。
- 不可變習慣:傾向
const、readonly 屬性、回傳新物件而非修改現有物件。
- 避免全域狀態:依賴注入容器 (PSR-11) 管理服務實例。
- 變數命名語意化:
$userCount 而非 $cnt、$isActive 而非 $flag。
結語
變數是程式操作資料的符號。理解 PHP 獨特的參考機制、作用域規則與超全域變數來源,配合現代型別系統與靜態分析工具,能避開 90% 的變數相關 Bug,寫出清晰可靠的程式碼。
copyright ©
萬盛學電腦網 all rights reserved