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

PHP 常數定義與使用完整指南:define、const、類常數、魔術常數

     編輯:PHP 綜合知識

PHP 常數完整體系

PHP 提供多種常數定義方式,適用於不同層級:全域、類別、介面、命名空間。理解其差異能寫出更清晰、安全的程式碼。

一、全域常數:define()

<?php
// 基本定義(大小寫敏感)
define('APP_NAME', 'MySystem');
define('MAX_UPLOAD_SIZE', 10 * 1024 * 1024); // 10MB

// PHP 7.0+ 支援陣列常數
define('ALLOWED_EXT', ['jpg', 'png', 'gif', 'webp']);

// 大小寫不敏感(第三參數 true,PHP 7.3 棄用,8.0 移除)
define('DEBUG_MODE', true, true); // 不建議使用

// 使用方式:直接常數名,不加 $
echo APP_NAME;
$max = MAX_UPLOAD_SIZE;
if (in_array($ext, ALLOWED_EXT)) { ... }
  • 執行時期定義,可動態決定值。
  • 全域可見,不受命名空間限制(除非在命名空間中定義)。
  • 不可重新定義,第二次呼叫會觸發 Notice 並忽略。

二、類常數:const

<?php
class Config {
    // PHP 5.3+ 支援
    const VERSION = '1.0.0';
    const DEFAULT_LANG = 'zh_TW';
    
    // PHP 5.6+ 支援運算式
    const MAX_SIZE = 1024 * 1024 * 5; // 5MB
    
    // PHP 7.1+ 可見度修飾詞
    public const PUBLIC_KEY = 'pub';
    protected const PROTECTED_KEY = 'prot';
    private const PRIVATE_KEY = 'priv';
    
    // PHP 8.0+ ::class 常數
    public static function getClassName() {
        return self::class; // 回傳 'Config'
    }
}

// 存取方式
echo Config::VERSION;
echo Config::PUBLIC_KEY;
// $obj = new Config(); echo $obj::VERSION; // PHP 5.3+ 支援物件存取

三、介面常數

<?php
interface HttpStatus {
    const OK = 200;
    const NOT_FOUND = 404;
    const SERVER_ERROR = 500;
}

echo HttpStatus::OK; // 200

四、魔術常數(預定義,依上下文動態變化)

常數說明範例輸出
__LINE__目前行號15
__FILE__完整檔案路徑(已解析符號連結)/var/www/html/index.php
__DIR__檔案所在目錄(等同 dirname(__FILE__))/var/www/html
__FUNCTION__函數名稱(區分大小寫)myFunction
__CLASS__類別名稱(含命名空間)App\Controllers\UserController
__TRAIT__Trait 名稱App\Traits\Loggable
__METHOD__類別方法名稱UserController::getProfile
__NAMESPACE__目前命名空間名稱App\Controllers
ClassName::class類別完整名稱(PHP 5.5+)App\Models\User

五、命名空間下的常數

<?php
namespace App\Config;

define('App\Config\DB_HOST', 'localhost'); // 全域常數,建議加命名空間前綴
const API_KEY = 'secret'; // 屬於 App\Config 命名空間

// 使用
echo \App\Config\DB_HOST; // 全域
echo API_KEY; // 同命名空間
echo \App\Config\API_KEY; // 完整限定名

六、常數 vs 變數比較

特性常數變數
符號無 $有 $
修改不可可
作用域全域/類別依定義處
值型別標量/陣列(PHP7+)任意
定義時機編譯/執行期執行期

最佳實踐建議

  1. 設定值、狀態碼、固定業務規則用常數,避免魔術數字散落程式碼。
  2. 類別內部常數用 const,全域應用層設定用 define() 或設定檔。
  3. 命名慣例:全域常數 UPPER_SNAKE_CASE,類常數 UPPER_SNAKE_CASE。
  4. 利用 ::class 避免字串硬編碼類別名,支援 IDE 重構。
  5. 避免在迴圈或高頻路徑呼叫 define(),雖有快取但仍有開銷。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved