PHP 8.2中推荐用const在顶层作用域定义全局常量(如const API_TIMEOUT = 3000;),仅支持标量、null及数组;define()仅用于动态场景(如条件分支或变量名拼接),禁用大小写不敏感模式;可用defined()、get_defined_constants()和constant()检查与访问。

要在PHP 8.2中正确定义和使用独立常量(即非类内、非命名空间嵌套的全局常量),必须严格区分define()与const两种语法的适用边界,尤其注意PHP 8.2对const在顶层作用域的强化支持和对define动态行为的延续性。
用const定义顶层常量(推荐)
这一步操作起来很简单,直接在PHP文件最外层写const语句即可,无需函数包裹或条件判断。
第一步:在脚本开头或任意全局位置,使用const关键字声明常量,名称全大写并用下划线分隔,例如:const API_TIMEOUT = 3000;
第二步:确保右侧赋值为标量(string/int/float/bool)、null,或自PHP 5.6起支持的数组——【PHP 8.2不支持在const中赋值闭包、对象、资源或可调用类型】。
立即学习“PHP免费学习笔记(深入)”;
第三步:保存后执行脚本,常量立即生效。调用时直接写名称,如echo API_TIMEOUT;,不加$符号。
用define()定义常量(保留兼容性场景)
当你需要在if分支、循环体或函数内部动态生成常量名时,define()仍是唯一选择,但PHP 8.2中它已不再是首选。
方法一:基础定义
调用define('DB_HOST', 'localhost');,常量名必须是字符串字面量,不能是变量。
方法二:大小写不敏感(慎用)define('debug_mode', true, true);——第三个参数设为true后,DEBUG_MODE、debug_mode、Debug_Mode均可访问。但【PHP 8.2文档明确警告:该模式破坏命名一致性,生产环境禁止使用】。
方法三:动态名称定义
先拼接名称字符串:$name = 'CACHE_' . strtoupper($env);,再传入define($name, $value);。这是define不可替代的核心能力。
检查与调试常量是否存在
定义完常量后,务必验证是否成功注册,避免因拼写错误或作用域误判导致静默失败。
执行var_dump(defined('API_TIMEOUT'));,返回bool(true)表示已定义;返回false说明未生效,常见原因是写在了函数体内或命名冲突。
若需批量查看所有用户定义常量,运行print_r(array_keys(get_defined_constants(true)['user']));,输出结果不含魔术常量和系统常量,只列你亲手定义的那些。
用echo constant('API_TIMEOUT');可间接取值——这在变量名来自配置或请求参数时特别有用,比如$key = $_GET['const']; echo constant($key);。



















