常數與變數是 PHP 程式資料儲存的兩大基石。常數提供不可變的全域標識,變數則支援靈活的資料操作與作用域控制。本文系統整理定義方式、差異比較、預定義常數/變數、靜態變數、全域變數與可變變數等進階主題。
define(name, value, case_insensitive):傳統函數式定義,第三參數控制大小寫敏感(預設 false)。const NAME = value;:PHP 5.3+ 支援,編譯時定義,語法簡潔,支援命名空間,大小寫敏感。$ 符號,動態名稱可用 constant() 取值。| 特性 | 常數 | 變數 |
|---|---|---|
| 符號前綴 | 無 | $ |
| 定義方式 | define()/const | 指派運算子 = |
| 作用域 | 全域自動生效 | 區域/全域需宣告 |
| 可重新定義 | 否 | 是 |
| 資料類型 | 純量 | 任意類型 |
PHP 提供九個編譯時解析的魔術常數,大小寫不敏感:
__LINE__:目前行號__FILE__:完整絕對路徑(含檔名)__DIR__:所在目錄(等同 dirname(__FILE__))__FUNCTION__:函數名稱(PHP 5+ 保留定義時大小寫)__CLASS__:類別名稱(含命名空間)__TRAIT__:Trait 名稱(PHP 5.4+)__METHOD__:類別方法名稱__NAMESPACE__:目前命名空間ClassName::class:類別完整名稱(PHP 5.5+)<?php $a = 'original'; $b = &$a; // $b 參考 $a $b = 'changed'; echo $a; // 輸出 changed ?>
全域自動可用,無需 global 宣告:$GLOBALS、$_SERVER、$_GET、$_POST、$_FILES、$_REQUEST、$_SESSION、$_ENV、$_COOKIE、$php_errormsg、$http_response_header、$argc、$argv。
<?php
$g = 10;
function test() {
global $g; // 方式一
echo $GLOBALS['g']; // 方式二(超全域陣列)
}
?>
函數內 static $var 保持跨呼叫狀態,僅初始化一次:
<?php
function counter() {
static $count = 0;
echo $count++;
}
counter(); // 0
counter(); // 1
?>
動態設定變數名稱:$$var。陣列語法需用大括號消除歧義:${$arr[1]} vs ${$arr}[1]。
<?php
// 常數定義(忽略大小寫)
define('APP_VERSION', '1.0.0', true);
echo APP_VERSION . '<br>';
echo app_version . '<br>'; // 相同
// 參考賦值
$str1 = 'hello';
$str2 = &$str1;
$str1 = 'world';
echo $str2; // world
// 超全域變數
echo $_SERVER['DOCUMENT_ROOT'];
// 全域變數
$globalVal = 100;
function showGlobal() {
global $globalVal;
echo $globalVal . ' ' . $GLOBALS['globalVal'];
}
showGlobal();
// 靜態變數
function staticDemo() {
static $i = 0;
echo $i++ . ' ';
}
staticDemo(); staticDemo(); staticDemo(); // 0 1 2
// 可變變數與物件屬性存取
class Foo {
public $bar = 'I am bar';
public $arr = ['A', 'B', 'C'];
}
$obj = new Foo();
$prop = 'bar';
echo $obj->$prop; // I am bar
echo $obj->{$prop}; // 同上
echo $obj->arr[1]; // B
echo $obj->{'arr'}[1]; // B
?>
精通常數與變數的運作細節,能寫出更穩定、可預測的 PHP 程式碼,是從初級邁向中高階開發者的關鍵里程碑。