首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 變數完整指南:定義規則、作用域、靜態變數、超全域陣列與最佳實踐

     編輯:PHP 相關知識

變數定義與命名規則

<?php
$variable_name = "value";  // 以 $ 開頭,後接名稱
?>
  • 首字元:字母 (a-z, A-Z) 或底線 _
  • 後續字元:字母、數字 (0-9)、底線
  • 不允許空格、特殊符號、中文 (雖技術上 UTF-8 允許,但強烈不建議)
  • 大小寫敏感:$var ≠ $Var ≠ $VAR
  • 合法範例:$name, $user_name, $_private, $item123
  • 非法範例:$123item, $user-name, $user name

建立與型別系統

PHP 為弱型別、動態型別語言:

  • 無需宣告型別,首次賦值即建立
  • 型別由值決定,可隨時改變
  • 支援 8 種基本型別:integer, float, string, boolean, array, object, resource, NULL
<?php
$str = "Hello";      // string
$int = 42;           // integer
$float = 3.14;       // float
$bool = true;        // boolean
$arr = [1, 2, 3];    // array
$obj = new StdClass; // object
$res = fopen('file.txt', 'r'); // resource
$null = null;        // NULL
?>

變數作用域詳解

1. 區域作用域

函數內部宣告的變數,僅在該函數內可見。

<?php
function test() {
    $local = "我是區域變數";
    echo $local; // 正常
}
test();
// echo $local; // 錯誤:未定義
?>

2. 全域作用域與 global 關鍵字

函數外部定義的變數為全域變數。函數內需用 global 關鍵字引用。

<?php
$global = "外部";

function test() {
    global $global; // 引入全域變數
    $global .= " -> 內部修改";
    echo $global; // 輸出:外部 -> 內部修改
}
test();
echo $global; // 輸出:外部 -> 內部修改 (全域變數已被修改)
?>

3. $GLOBALS 超全域陣列

所有全域變數自動存入 $GLOBALS['var_name'],函數內可直接存取,無需 global。

<?php
$x = 5; $y = 10;
function sum() {
    $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
sum();
echo $z; // 15
?>

4. 靜態變數

函數結束後保留值,下次呼叫繼續使用。僅在函數內可見。

<?php
function counter() {
    static $count = 0;
    $count++;
    echo $count . ' ';
}
counter(); // 1
counter(); // 2
counter(); // 3
?>
靜態變數常用於:遞迴計數、快取計算結果、單例模式實例儲存。

5. 參數作用域

函數參數屬於區域變數,由呼叫者傳值/傳址建立。

<?php
function add($a, $b) { // $a, $b 為參數變數
    return $a + $b;
}
echo add(3, 5); // 8
?>

超全域變數 (Superglobals) 速查表

變數用途範例
$GLOBALS所有全域變數$GLOBALS['config']
$_SERVER伺服器與執行環境資訊$_SERVER['REQUEST_URI'], $_SERVER['HTTP_HOST']
$_GETURL 查詢字串參數$_GET['id']
$_POSTPOST 表單資料$_POST['username']
$_REQUEST$_GET + $_POST + $_COOKIE (不建議使用)
$_SESSIONSession 資料$_SESSION['user_id']
$_COOKIECookie 資料$_COOKIE['remember_me']
$_FILES上傳檔案資訊$_FILES['avatar']['tmp_name']
$_ENV環境變數$_ENV['APP_ENV']

變數引用與銷毀

<?php
$a = 10;
$b = &$a;  // $b 參考 $a
$b = 20;
echo $a;   // 20

unset($b); // 僅銷毀引用,$a 仍存在
echo $a;   // 20

unset($a); // 完全銷毀變數
// echo $a; // Notice: Undefined variable
?>

型別轉換與判斷

函數用途範例
gettype($var)取得型別字串"integer", "array"
settype($var, $type)強制轉型 (修改原變數)settype($x, "integer")
(int)$var, (string)$var暫時轉型 (不修改原變數)$int = (int)"123abc"; // 123
is_int(), is_string(), is_array()...型別檢查 (回傳 bool)is_array([]) // true
isset($var)變數存在且非 null
empty($var)變數不存在或為「空」值 (0, "", [], null, false)

常見陷阱與最佳實踐

  1. 未初始化變數直接使用:會觸發 Notice,建議開啟 error_reporting(E_ALL) 開發階段。
  2. foreach 參考變數未 unset:
    foreach ($arr as &$v) { $v *= 2; }
    unset($v); // 必須釋放參考,否則 $v 仍指向最後一個元素
    
  3. 全域變數濫用:優先使用依賴注入、服務容器、單例模式管理共享狀態。
  4. 變數變數 (Variable Variables):$name = 'foo'; $$name = 'bar'; // $foo = 'bar' — 僅在極少數動態情境使用,降低可讀性。
  5. 預定義變數命名衝突:避免使用 $GLOBALS, $_POST 等作為自訂變數名。

進階:型別宣告 (PHP 7.0+)

<?php
// 參數型別宣告
function add(int $a, int $b): int {
    return $a + $b;
}
// 嚴格模式 (檔案頂部)
declare(strict_types=1);
add(1.5, 2); // TypeError: Argument 1 must be int, float given
?>

總結

PHP 變數以 $ 開頭、弱型別動態建立、作用域分為區域/全域/靜態/參數四種。善用 $GLOBALS、global、static 關鍵字控制可見範圍,熟悉 9 大超全域陣列,配合 declare(strict_types=1) 嚴格模式,即能寫出型別安全、易維護的現代 PHP 程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved