PHP 提供九個超全域變數,它們在所有作用域自動可用,無需 global 宣告。掌握它們的用途與差異,是處理 HTTP 請求、表單資料、會話管理的基石。
| 變數 | 用途 | 資料來源 |
|---|---|---|
$GLOBALS | 所有全域變數的引用陣列 | 腳本全域範圍 |
$_SERVER | 伺服器與執行環境資訊 | Web Server / CGI 環境 |
$_GET | URL 查詢字串參數 | GET 請求 |
$_POST | 表單提交資料 (application/x-www-form-urlencoded / multipart/form-data) | POST 請求 |
$_COOKIE | HTTP Cookie 資料 | Client 瀏覽器 |
$_FILES | 檔案上傳資訊 | POST 檔案上傳 |
$_ENV | 環境變數 | 伺服器環境 |
$_REQUEST | $_GET + $_POST + $_COOKIE 合併 | 混合來源 (順序受 php.ini 控制) |
$_SESSION | 會話資料 | 伺服器端 Session 存儲 |
$_SERVER 是最豐富的超全域陣列,包含 HTTP 標頭、路徑、腳本位置等關鍵資訊。
| 鍵名 | 說明 | 範例值 |
|---|---|---|
PHP_SELF | 當前執行腳本路徑 (相對 Document Root) | /index.php |
QUERY_STRING | 查詢字串 (? 之後內容) | id=123&name=test |
REQUEST_METHOD | 請求方法 | GET, POST, PUT, DELETE |
REQUEST_URI | 完整請求 URI | /product?id=123 |
HTTP_HOST | Host 標頭 | example.com |
HTTP_REFERER | 來源頁面 URL (不可靠,可偽造) | https://google.com/search?q=php |
HTTP_USER_AGENT | User-Agent 標頭 | Mozilla/5.0... |
REMOTE_ADDR | 客戶端 IP | 192.168.1.100 |
SERVER_NAME | 伺服器主機名 | example.com |
SERVER_PORT | 伺服器埠號 | 80, 443 |
SCRIPT_FILENAME | 腳本絕對路徑 | /var/www/html/index.php |
DOCUMENT_ROOT | 文件根目錄 | /var/www/html |
HTTPS | 是否 HTTPS | on / off |
REQUEST_TIME | 請求開始時間戳 (Unix) | 1700000000 |
REQUEST_TIME_FLOAT | 微秒精度時間戳 | 1700000000.1234 |
<?php
// 取得客戶端真實 IP (考慮代理)
function getClientIP() {
$keys = ['HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'REMOTE_ADDR'];
foreach ($keys as $key) {
if (!empty($_SERVER[$key])) {
$ips = explode(',', $_SERVER[$key]);
return trim($ips[0]);
}
}
return 'unknown';
}
// 判斷是否 AJAX 請求
function isAjax() {
return isset($_SERVER['HTTP_X_REQUESTED_WITH'])
&& strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}
// 建立完整 URL
function getCurrentURL() {
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
return $protocol . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}
?>
post_max_size、memory_limit 影響)enctype="multipart/form-data" 才能上傳檔案<?php
// 預設順序:GPC (GET → POST → COOKIE)
// 可在 php.ini 設定 variables_order = "GPC"
// 風險:同名鍵值會互相覆蓋,來源不可控
$id = $_REQUEST['id'] ?? null; // 不知道 id 來自 GET/POST/COOKIE 哪裡
?>
建議:明確使用 $_GET 或 $_POST,避免 $_REQUEST 帶來的安全與除錯困擾。
<?php
// HTML 表單需設定 enctype="multipart/form-data"
/*
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="avatar">
<button type="submit">上傳</button>
</form>
*/
// $_FILES 結構
// $_FILES['avatar'] = [
// 'name' => 'photo.jpg', // 原始檔名
// 'type' => 'image/jpeg', // MIME 類型 (客戶端提供,不可信)
// 'tmp_name' => '/tmp/phpA1B2C3', // 暫存路徑
// 'error' => 0, // 錯誤代碼 (0=成功)
// 'size' => 102400, // 檔案大小 (bytes)
// ];
// 基本驗證與移動
if ($_FILES['avatar']['error'] === UPLOAD_ERR_OK) {
$allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['avatar']['tmp_name']);
if (in_array($mime, $allowedTypes, true)) {
$dest = '/var/www/uploads/' . bin2hex(random_bytes(8)) . '.jpg';
move_uploaded_file($_FILES['avatar']['tmp_name'], $dest);
echo "上傳成功:$dest";
} else {
echo "檔案類型不允許";
}
}
?>
| 特性 | Cookie ($_COOKIE) | Session ($_SESSION) |
|---|---|---|
| 儲存位置 | 客戶端瀏覽器 | 伺服器端 (檔案/Redis/DB) |
| 容量限制 | 約 4KB / 個 | 受伺服器儲存空間限制 |
| 生命週期 | 可設定過期時間 | 瀏覽器關閉或 gc_maxlifetime 過期 |
| 安全性 | 可被竄改、攔截 (需 HttpOnly、Secure、SameSite) | 較安全,僅 Session ID 在客戶端 |
| 適用場景 | 記住登入、偏好設定、追蹤 | 用戶身份、購物車、敏感狀態 |
<?php
// 啟動 Session (必須在輸出前)
session_start();
// 防止 Session Fixation
if (!isset($_SESSION['initiated'])) {
session_regenerate_id(true);
$_SESSION['initiated'] = true;
}
// 設定 Cookie 參數 (PHP 7.3+)
session_set_cookie_params([
'lifetime' => 3600,
'path' => '/',
'domain' => '.example.com',
'secure' => true, // 僅 HTTPS
'httponly' => true, // 防 XSS
'samesite' => 'Lax', // 防 CSRF
]);
// 存取資料
$_SESSION['user_id'] = 12345;
$_SESSION['permissions'] = ['read', 'write'];
?>
<?php
$globalVar = "I'm global";
function test() {
// 方式 1:global 關鍵字
global $globalVar;
echo $globalVar;
// 方式 2:$GLOBALS 陣列 (不需 global 宣告)
echo $GLOBALS['globalVar'];
// 方式 3:修改全域變數
$GLOBALS['globalVar'] = 'Modified';
}
?>
| 常數 | 說明 |
|---|---|
__FILE__ | 當前檔案完整路徑 |
__DIR__ | 當前檔案目錄 (PHP 5.3+) |
__LINE__ | 當前行號 |
__FUNCTION__ | 當前函式名稱 |
__CLASS__ | 當前類別名稱 |
__METHOD__ | 當前方法名稱 |
__NAMESPACE__ | 當前命名空間 |
PHP_VERSION | PHP 版本字串 |
PHP_OS | 作業系統類型 |
filter_input() 或手動驗證finfo 而非 $_FILES['type'])$_SERVER['HTTP_REFERER']、$_SERVER['HTTP_X_FORWARDED_FOR']display_errors、開啟 log_errors九大超全域變數是 PHP 處理 HTTP 互動的核心 API。$_GET/$_POST 分工明確,$_SESSION 管理狀態,$_SERVER 提供環境感知,$_FILES 處理上傳。理解它們的資料來源、生命週期與安全邊界,能寫出更健壯、安全的 PHP 應用。