萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 常量完整指南:預定義常量、define() 用法與魔術常量

常量 vs 變數

  • 常量:一次定義、全域可見、不可變更、無 $ 前綴、慣用全大寫命名。
  • 變數:可重新賦值、有作用域、以 $ 開頭。

預定義核心常量

常量說明範例輸出
__FILE__目前執行腳本完整路徑(含檔名)/var/www/html/index.php
__DIR__目前腳本所在目錄(PHP 5.3+)/var/www/html
__LINE__目前行號42
__FUNCTION__目前函數名稱(PHP 4.3+)myFunc
__CLASS__目前類別名稱(PHP 4.3+)UserModel
__METHOD__目前類別方法名稱(PHP 5.0+)UserModel::getName
__NAMESPACE__目前命名空間(PHP 5.3+)App\Models
PHP_VERSIONPHP 版本字串8.2.12
PHP_OS作業系統家族Linux
PHP_SAPIServer API 類型fpm-fcgi, cli
PHP_EOL平台換行符\n (Linux), \r\n (Win)
PHP_INT_MAX整數最大值9223372036854775807 (64-bit)
TRUE, FALSE, NULL布林與空值-

自訂常量:define() 與 const

define() - 執行期定義,支援動態名稱

<?php
define('APP_NAME', 'MyApplication');
define('MAX_UPLOAD_SIZE', 10 * 1024 * 1024); // 運算式
define('ALLOWED_EXTS', ['jpg','png','gif']); // 陣列常量 (PHP 7+)

echo APP_NAME; // MyApplication

// 動態定義
$prefix = 'DB_';
define($prefix . 'HOST', 'localhost'); // DB_HOST

const - 編譯期定義,類別常量首選

<?php
class Config {
    const DB_HOST = 'localhost';
    const STATUS = ['draft' => 0, 'published' => 1];
}
// 呼叫
Config::DB_HOST;

差異:const 必須在最頂層或類別內、名稱不可動態、編譯期解析、效能略優;define() 可在條件判斷/迴圈中動態定義。

魔術常量實戰範例:錯誤回報

<?php
function logError($message) {
    $msg = sprintf(
        "[%s] %s:%d - %s\n",
        date('Y-m-d H:i:s'),
        __FILE__,
        __LINE__,
        $message
    );
    error_log($msg, 3, '/var/log/app_errors.log');
}

logError('資料庫連線失敗'); // 自動記錄檔案與行號

常見陷阱

  • 常量未定義視為字串:echo UNDEFINED_CONST 會發出 Notice 並輸出 "UNDEFINED_CONST"(PHP 8.0+ 拋 Error)。
  • 大小寫敏感:define('FOO', 1, true) 第三參數 true 可設不區分大小寫(不推薦,易混淆)。
  • 命名空間影響:define('FOO', 1) 定義於全域;namespace A; define('FOO', 2) 實際定義 \A\FOO。

結語

善用常量消除「魔術數字」,配合魔術常量實現精準除錯,是撰寫可維護 PHP 專案的基礎功夫。現代專案建議:類別常量用 const、全域設定用 define()、環境差異配置用 .env + vlucas/phpdotenv。

copyright © 萬盛學電腦網 all rights reserved