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

PHP 常數與變數深度解析:定義、作用域與魔術常數

     編輯:PHP 相關知識

PHP 常數與變數核心機制完全指南

常數與變數是 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。

全域變數與 $GLOBALS

<?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
?>

最佳實務建議

  1. 常數用於設定值、狀態碼、配置參數,提升可讀性與維護性。
  2. 避免濫用全域變數,優先使用依賴注入或單例模式管理共享狀態。
  3. 靜態變數適合快取、計數器等需保持狀態的場景。
  4. 善用魔術常數進行除錯日誌與動態載入類別。
  5. 可變變數威力大但降低可讀性,謹慎使用並加註解說明。

精通常數與變數的運作細節,能寫出更穩定、可預測的 PHP 程式碼,是從初級邁向中高階開發者的關鍵里程碑。

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