基本特性
- **無需宣告型別**:第一次賦值即建立變數。
- **區分大小寫**:
$name ≠ $Name ≠ $NAME。
- **$ 開頭**:
$variable_name,名稱遵循識別字規則 (字母、底線、數字,不以數字開頭)。
- **值賦值 vs 參考賦值**:預設值複製;
& 符號建立參考。
賦值機制
<?php
// 值賦值:複製資料
$a = 10;
$b = $a; // $b = 10
$b = 20; // $a 仍為 10
// 參考賦值:指向同一記憶體
$c = 10;
$d = &$c; // $d 參考 $c
$d = 20; // $c 也變 20
// 函數參數參考傳遞
function addPrefix(&$str, $prefix) { $str = $prefix . $str; }
$name = 'John';
addPrefix($name, 'Mr. '); // $name 變 'Mr. John'
?>
四大作用域
| 作用域 | 定義位置 | 可存取範圍 | 生命週期 |
| **區域 (Local)** | 函數/方法內部 | 僅該函數內 | 函數結束銷毀 |
| **全域 (Global)** | 函數外部 (腳本最上層) | 全腳本 (函數需 global 或 $GLOBALS) | 腳本結束銷毀 |
| **靜態 (Static)** | 函數內 static $var | 僅該函數內 | **諸生不滅**,跨呼叫保留值 |
| **參數 (Parameter)** | 函數簽名 | 僅該函數內 | 函數結束銷毀 |
作用域範例
<?php
$x = 4; // 全域
function testScope() {
$x = 0; // 區域,遮蔽全域
echo "區域 \$x = $x\n"; // 0
}
testScope();
echo "全域 \$x = $x\n"; // 4
// 存取全域變數
$y = 10;
function accessGlobal() {
global $y; // 方式 1:global 關鍵字
$GLOBALS['y'] = 20; // 方式 2:$GLOBALS 超全域陣列
}
accessGlobal();
echo $y; // 20
// 靜態變數:遞迴、計數器
function counter() {
static $count = 0;
$count++;
echo "$count ";
}
counter(); counter(); counter(); // 1 2 3
?>
超全域變數 (Superglobals)
自動全域可用,無需 global 宣告:
| 變數 | 用途 |
$GLOBALS | 所有全域變數的參考陣列 |
$_SERVER | 伺服器與執行環境資訊 (Headers, Paths, Script 位置) |
$_GET | URL 查詢字串參數 |
$_POST | POST 表單資料 |
$_FILES | 上傳檔案資訊 |
$_COOKIE | HTTP Cookie |
$_SESSION | Session 資料 |
$_REQUEST | $_GET + $_POST + $_COOKIE 合併 (順序受 variables_order 影響) |
$_ENV | 環境變數 |
最佳實務
- 盡量避免全域變數:造成耦合、難測試、命名衝突。改用依賴注入、單例、服務容器。
- 函數參數預設值:
function greet($name = 'Guest')。
- 型別宣告 (PHP 7+):
function add(int $a, int $b): int 提升可讀性與錯誤偵測。
- 變數變數 (Variable Variables):
$$name 動態存取,慎用,難維護。
- 解構賦值 (PHP 7.1+):
[$a, $b] = [1, 2];、['x' => $x, 'y' => $y] = $arr;。