PHP 變數 (Variable)

變數是用來儲存資料的容器。PHP 是弱型別語言,變數不需要事先宣告型別,PHP 會根據賦予的值自動決定型別。

變數語法

PHP 變數以 $ 符號開頭,後面接變數名稱:

<?php
$name = "Alice";
$age = 25;
$price = 99.99;
$isStudent = true;
?>

變數命名規則

變數名稱必須遵循以下規則:

  1. $ 開頭
  2. 第一個字元必須是字母或底線 _
  3. 後續字元可以是字母、數字或底線
  4. 區分大小寫
<?php
// 合法的變數名稱
$name = "Alice";
$_name = "Bob";
$name2 = "Charlie";
$firstName = "David";
$first_name = "Eve";

// 不合法的變數名稱
// $2name = "Frank";    // 不能以數字開頭
// $first-name = "Grace"; // 不能包含連字號
// $first name = "Henry"; // 不能包含空格
?>

命名慣例

PHP 社群常用的命名慣例:

<?php
// 駝峰式 (camelCase) - 常用於變數和函數
$firstName = "Alice";
$totalAmount = 100;

// 蛇底式 (snake_case) - 也常用於變數
$first_name = "Alice";
$total_amount = 100;

// Pascal Case - 常用於類別名稱
class UserAccount {}
class ShoppingCart {}

// 常數使用全大寫加底線
define('MAX_SIZE', 100);
const DATABASE_HOST = 'localhost';
?>

賦值

使用 = 運算子賦值:

<?php
$x = 10;
$y = 20;
$z = $x + $y;  // $z = 30

// 可以在同一行賦值多個變數
$a = $b = $c = 0;  // 三個變數都是 0
?>

變數型別

PHP 會自動判斷變數型別:

<?php
$string = "Hello";       // string
$integer = 42;           // integer
$float = 3.14;           // float (double)
$boolean = true;         // boolean
$array = [1, 2, 3];      // array
$null = null;            // NULL

// 使用 gettype() 查看型別
echo gettype($string);   // string
echo gettype($integer);  // integer
echo gettype($float);    // double
echo gettype($boolean);  // boolean
?>

動態型別

變數可以隨時改變型別:

<?php
$var = "Hello";
echo gettype($var);  // string

$var = 123;
echo gettype($var);  // integer

$var = 3.14;
echo gettype($var);  // double

$var = true;
echo gettype($var);  // boolean
?>

檢查變數

isset() - 檢查變數是否存在且不為 null

<?php
$name = "Alice";
$age = 0;
$empty = "";
$nothing = null;

var_dump(isset($name));      // bool(true)
var_dump(isset($age));       // bool(true)
var_dump(isset($empty));     // bool(true)
var_dump(isset($nothing));   // bool(false) - null 視為未設定
var_dump(isset($undefined)); // bool(false)
?>

empty() - 檢查變數是否為空

以下值被視為空:"" (空字串)、00.0"0"nullfalse[] (空陣列)

<?php
$name = "Alice";
$age = 0;
$empty = "";
$nothing = null;

var_dump(empty($name));     // bool(false)
var_dump(empty($age));      // bool(true) - 0 視為空
var_dump(empty($empty));    // bool(true)
var_dump(empty($nothing));  // bool(true)
var_dump(empty($undefined));// bool(true)
?>

is_null() - 檢查變數是否為 null

<?php
$nothing = null;
$name = "Alice";

var_dump(is_null($nothing));  // bool(true)
var_dump(is_null($name));     // bool(false)
?>

變數的變數 (Variable Variables)

PHP 支援使用變數的值作為另一個變數的名稱:

<?php
$varName = "hello";
$$varName = "World";  // 等同於 $hello = "World"

echo $hello;  // World
echo $$varName;  // World
?>

實際應用範例:

<?php
$fields = ['name', 'email', 'phone'];

foreach ($fields as $field) {
    $$field = $_POST[$field] ?? '';
}

// 現在有 $name, $email, $phone 三個變數
echo $name;
echo $email;
echo $phone;
?>
變數的變數可能會讓程式碼難以閱讀和維護,建議謹慎使用,通常使用陣列是更好的選擇。

變數作用域

變數的作用域決定了變數在哪裡可以被存取:

<?php
$global = "全域變數";

function test() {
    $local = "區域變數";

    // 無法直接存取全域變數
    // echo $global;  // 警告:未定義變數

    echo $local;  // 區域變數
}

test();
echo $global;  // 全域變數
// echo $local;  // 錯誤:未定義變數
?>

更詳細的作用域說明請參考 變數作用域 章節。

參考賦值 (Reference Assignment)

使用 & 可以建立變數的參考,兩個變數會指向同一個值:

<?php
$a = 10;
$b = &$a;  // $b 是 $a 的參考

echo $a;  // 10
echo $b;  // 10

$b = 20;

echo $a;  // 20 - $a 也被改變了
echo $b;  // 20
?>

一般賦值 vs 參考賦值

<?php
// 一般賦值(複製值)
$a = 10;
$b = $a;
$b = 20;
echo $a;  // 10 - $a 不受影響

// 參考賦值(指向同一個值)
$x = 10;
$y = &$x;
$y = 20;
echo $x;  // 20 - $x 也被改變
?>

預定義變數

PHP 提供了許多預定義變數,稱為超全域變數:

<?php
// 超全域變數(Superglobals)
$_GET      // URL 參數
$_POST     // POST 資料
$_REQUEST  // GET + POST + COOKIE
$_SESSION  // Session 資料
$_COOKIE   // Cookie 資料
$_FILES    // 上傳的檔案
$_SERVER   // 伺服器和執行環境資訊
$_ENV      // 環境變數
$GLOBALS   // 所有全域變數的參考

// 範例
echo $_SERVER['REQUEST_METHOD'];  // GET 或 POST
echo $_SERVER['HTTP_USER_AGENT']; // 瀏覽器資訊
?>

更詳細的說明請參考 超全域變數 章節。

常用的變數函數

<?php
$var = "Hello";

// 取得型別
echo gettype($var);  // string

// 列印變數資訊(除錯用)
var_dump($var);      // string(5) "Hello"
print_r($var);       // Hello

// 檢查型別
var_dump(is_string($var));  // bool(true)
var_dump(is_int($var));     // bool(false)
var_dump(is_array($var));   // bool(false)
var_dump(is_bool($var));    // bool(false)
var_dump(is_null($var));    // bool(false)

// 刪除變數
unset($var);
var_dump(isset($var));  // bool(false)
?>