在 PHP 開發中,變數與常數是構建程式邏輯的基石。本文將系統性介紹變數宣告、作用域、引用機制,以及常數定義與魔術常數的實戰應用,幫助初學者建立扎實的基礎觀念。
PHP 變數以 $ 符號開頭,區分大小寫。正確的宣告方式為 $var_name = value;。初學者常犯的錯誤是漏寫 $ 符號,導致變數無效。
<?php
$txt = "Hello World!";
$number = 16;
?>
PHP 變數名稱區分大小寫,$var 與 $VAR 是兩個不同變數。自 PHP 4 起引入引用賦值機制,使用 & 符號實現,類似 C/C++ 的指標概念:
<?php
$foo = 'Bob';
$bar = &$foo; // 透過引用指向同一記憶體位址
$bar = "My name is $bar";
echo $bar; // 輸出: My name is Bob
echo $foo; // $foo 也被修改了
?>
變數變數(Variable Variables)允許動態建立變數名稱:
<?php
$a = "b";
$$a = "123"; // 相當於 $b = "123"
echo $b; // 輸出: 123
?>
字串串接使用點號 . 運算子:
<?php
$a = "PHP 4";
$b = "功能強大";
echo $a . $b; // 輸出: PHP 4功能強大
?>
超全域變數在所有作用域皆可存取,無需 global 宣告:
| 變數 | 說明 |
|---|---|
$GLOBALS | 包含所有全域變數的陣列,鍵名為變數名稱 |
$_SERVER | 伺服器與執行環境資訊 |
$_GET | URL 參數(查詢字串) |
$_POST | POST 表單提交資料 |
$_COOKIE | Cookie 資料 |
$_FILES | 檔案上傳資訊 |
$_ENV | 環境變數 |
$_REQUEST | GET、POST、COOKIE 合併(不建議直接使用) |
$_SESSION | Session 變數 |
注意: PHP 4.2.0 起 register_globals 預設關閉,需使用超全域陣列存取外部輸入資料。
常數一經定義不可變更(魔術常數除外),慣例使用全大寫命名。使用 define() 函數定義:
<?php
// 合法常數名
define("FOO", "something");
define("FOO2", "something else");
define("FOO_BAR", "something more");
// 非法:不能以數字開頭
// define("2FOO", "something");
// 避免使用雙底線開頭,防止與未來魔術常數衝突
// define("__FOO__", "something");
?>
define() 語法:bool define(string $name, mixed $value, bool $case_insensitive = false)。第三個參數設為 true 可不區分大小寫。
魔術常數會根據使用位置動態變化,並非真正的常數:
| 常數 | 說明 |
|---|---|
__LINE__ | 檔案中的目前行號 |
__FILE__ | 檔案完整路徑與檔名(PHP 4.0.2+ 為絕對路徑) |
__DIR__ | 檔案所在目錄(等同 dirname(__FILE__),PHP 5.3.0+) |
__FUNCTION__ | 函數名稱(PHP 5+ 區分大小寫) |
__CLASS__ | 類別名稱(PHP 5+ 區分大小寫) |
__METHOD__ | 類別方法名稱(PHP 5.0.0+) |
__NAMESPACE__ | 目前命名空間名稱(PHP 5.3.0+) |
善用魔術常數可簡化除錯與日誌記錄,例如 __FILE__ . ':' . __LINE__ 可快速定位程式碼位置。