PHP 常量:不可改变的值

小飞兽 PHP 17 次阅读 2026-07-16

什么是常量

常量是一个固定值,在脚本执行过程中不可改变。与变量的区别是:变量可以随时重新赋值,常量一旦定义就不能改变。

一、定义常量

使用 define()

<?php\n// define(常量名, 常量值, 是否大小写不敏感)\ndefine(''SITE_NAME'', ''绍大技术网'');\ndefine(''VERSION'', ''1.0.0'');\ndefine(''MAX_COUNT'', 100);\n\n// 访问常量\necho SITE_NAME;      // 绍大技术网\necho constant(''SITE_NAME'');  // 绍大技术网(通过字符串获取)\n?>

使用 const(PHP 5.3+)

<?php\nconst SITE_NAME = ''绍大技术网'';\nconst VERSION = ''1.0.0'';\nconst MAX_COUNT = 100;\n\n// const 可用于类内部定义类常量\nclass Config {\n    const DEBUG = true;\n    const DB_HOST = ''localhost'';\n}\necho Config::DEBUG;  // 1\n?>

define vs const

    • const 在编译时求值,define 在运行时求值
    • const 更快,适合定义确定的值
    • define 可以用于条件语句内定义常量
    • const 不能用于类属性常量定义之外的类内部(要用 const
    <?php\n// const 必须在文件最顶层定义(不能用 if 包裹)\nconst APP_NAME = ''MyApp'';\n\n// define 可以在条件语句内\nif ($env === ''production'') {\n    define(''DEBUG'', false);\n} else {\n    define(''DEBUG'', true);\n}\n?>

    二、常量是否大小写敏感

    <?php\n// 第三个参数 false(默认):区分大小写\ndefine(''SITE_NAME'', ''绍大技术网'', false);\necho SITE_NAME;     // 正常\necho site_name;     // 报错\n\n// 第三个参数 true:不区分大小写\ndefine(''AUTHOR'', ''小明'', true);\necho AUTHOR;        // 正常\necho author;        // 也正常\n?>

    三、判断常量是否已定义

    <?php\ndefine(''SITE_NAME'', ''绍大技术网'');\n\n// 检查常量是否已定义\nif (defined(''SITE_NAME'')) {\n    echo SITE_NAME;\n}\n\n// 检查常量是否存在(变量用 isset(),常量用 defined())\nif (defined(''NOT_EXIST'')) {\n    echo NOT_EXIST;\n} else {\n    echo "常量未定义";\n}\n?>

    四、预定义常量

    PHP 内置了大量预定义常量:

    <?php\n// 常用预定义常量\nPHP_VERSION;           // PHP 版本,如 "8.2.10"\nPHP_OS;                // 操作系统,如 "Linux"\nPHP_SAPI;              // 服务器 API,如 "apache2handler"\n\n// 路径常量\n__FILE__;              // 当前文件的完整路径\n__DIR__;               // 当前文件所在目录(dirname(__FILE__))\n__LINE__;              // 当前行号\n__FUNCTION__;          // 当前函数名\n__CLASS__;             // 当前类名\n__METHOD__;            // 当前类::方法名\n__NAMESPACE__;         // 当前命名空间\n\n// 魔术常量(值随上下文变化)\necho __FILE__;   // /var/www/html/config.php\necho __DIR__;    // /var/www/html\necho __LINE__;   // 10(当前行号)\n?>

    五、类常量

    <?php\nclass Config {\n    // 类常量用 const 定义\n    const DEBUG = true;\n    const DB_HOST = ''localhost'';\n    const DB_PORT = 3306;\n    const DB_NAME = ''myapp'';\n    const VERSION = ''1.0.0'';\n\n    // 静态属性也可以定义配置\n    public static string $env = ''development'';\n}\n\n// 访问类常量\necho Config::DEBUG;       // 1\necho Config::DB_HOST;     // localhost\n\n// 在类外部访问\necho MyClass::VERSION;\n\n// 通过类常量获取所有配置\n$reflection = new ReflectionClass(Config::class);\n$constants = $reflection->getConstants();\nprint_r($constants);\n?>

    六、常量与配置

    <?php\n// 最佳实践:用常量存储配置\nconst DB_HOST = ''localhost'';\nconst DB_USER = ''root'';\nconst DB_PASS = ''password'';\nconst DB_NAME = ''myapp'';\nconst DB_CHARSET = ''utf8mb4'';\n\n// 数据库连接\ntry {\n    $pdo = new PDO(\n        sprintf(''mysql:host=%s;dbname=%s;charset=%s'', DB_HOST, DB_NAME, DB_CHARSET),\n        DB_USER,\n        DB_PASS\n    );\n    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);\n} catch (PDOException $e) {\n    die(''数据库连接失败:'' . $e->getMessage());\n}\n?>

    七、const 与表达式(PHP 8+)

    <?php\n// PHP 8.3+ 支持在 const 中使用表达式\nconst SUM = 1 + 2 + 3;\nconst MAX_VAL = 100;\nconst ITEMS = [1, 2, 3, MAX_VAL];  // PHP 7+ 支持数组常量\n\n// 使用 define 定义数组常量(PHP 7+)\ndefine(''COLORS'', [''红'', ''绿'', ''蓝'']);\necho COLORS[0];  // 红\n?>

    总结

    • 常量定义后不可改变,用 define()const
    • const 更快,但必须在顶层;define 可条件定义
    • 检查常量是否存在用 defined()(不是 isset()
    • __FILE__/__DIR__/__LINE__/__FUNCTION__/__CLASS__ 是魔术常量
    • 类常量用 const 定义,通过 ClassName::CONST_NAME 访问
  • 推荐用常量存储配置值,不要硬编码在代码中