Fatal error: Undefined constant主因是常量未加载,非代码错误;应通过var_dump(get_defined_constants(true)['user'])查已定义项、检查定义语句是否被条件/异常跳过、区分系统与自定义常量并用defined()正确检测。

PHP报“Fatal error: Undefined constant”不是代码写错了,而是常量根本没加载进来。问题不在用法,而在定义时机、作用域和环境一致性。下面三种方法能快速定位真实原因,不绕弯子。
一、直接看当前有哪些常量在生效
别猜,直接查。在报错位置前加一行:
var_dump(get_defined_constants(true)['user'] ?? []);
它会列出所有已加载的用户自定义常量。如果目标常量不在里面,说明它压根没被定义——不是拼写错,是没执行到定义语句。
立即学习“PHP免费学习笔记(深入)”;
- 检查该行输出是否为空数组:空 = 入口没加载constants文件
- 搜索目标常量名:没出现 = 条件分支跳过了,比如
if (ENV === 'dev')里定义,但线上是prod - 注意大小写:MY_CONST 和 my_const 是两个不同常量
二、确认定义位置是否被跳过或中断
常量定义不是写了就存在,它可能被条件判断、异常、exit 或 return 挡在门外。
重点排查以下情况:
- 定义语句包在
if (getenv('APP_ENV') === 'local')里 → 线上环境不满足条件,整段跳过 - 定义前有
return或exit,比如配置加载失败后直接终止 - 定义语句在某个函数或类方法内部 → 常量只在该作用域有效,外部不可见
- 使用
include/require引入定义文件,但路径错误或权限不足导致引入失败(无报错,静默跳过)
三、区分系统常量与自定义常量,避免误判
有些常量是PHP自带的(如PHP_VERSION、__DIR__),永远存在;有些是你自己定义的(如DB_HOST),必须手动加载。
常见误区:
- 对
defined('PHP_VERSION')做判断 → 永远为true,没必要,也掩盖了真正要检查的自定义常量 - 把
__FILE__当变量用:echo __FILE__;正确,echo $__FILE__;就报错 - 在条件中重复定义系统常量,如
if (!defined('E_DEPRECATED')) define('E_DEPRECATED', 8192);→ 新版PHP可能冲突或警告 - 混淆
defined()和isset():isset(MY_CONST)无效,常量不能用isset检测,必须用defined



















