const是编译期语言结构,支持类/命名空间/全局作用域,名称必须字面量;define()是运行时函数,仅限全局作用域,名称可动态生成,适合插件等特殊场景。

PHP 常量(const)和 define() 的核心区别,不在于“能不能定义常量”,而在于“在什么上下文、以什么方式、何时生效”。
作用域与声明位置不同
const 是语言结构,支持类内、命名空间内、全局作用域中声明;define() 是函数,只能在全局作用域(包括函数外或函数内)调用,不能直接在类定义体中使用(PHP 5.6+ 支持 const class_name::CONST,但 define 不支持类常量)。
- 类中必须用
const MY_CONST = 1;,不能写define('MY_CONST', 1); - 命名空间下推荐用
const NS_CONST = 2;(PHP 5.6+),define 需传完整名称如define('My\NS\CONST', 2); - 函数内可用 define() 动态创建全局常量,const 在函数内会报语法错误
值的类型与灵活性差异
define() 允许常量名和值都为变量或表达式(运行时解析),const 的常量名必须是字面量(编译期确定),值在 PHP 5.6+ 支持标量和数组,PHP 7.4+ 支持 null、true、false,但仍不支持任意表达式。
-
define($name, $value);合法 —— 名称可动态生成 -
const $name = $value;语法错误 -
const PI = 3.14159;合法;const MAX = 2 * 1024;PHP 5.6+ 才支持(仅限简单标量运算) -
define('MAX', 2 * 1024);始终合法,因为表达式在函数调用时求值
性能与底层机制
const 是编译期指令,解析更快,更轻量;define() 是运行时函数调用,有函数开销,且每次调用都要做名称合法性检查(如是否已定义、是否含非法字符)。
立即学习“PHP免费学习笔记(深入)”;
- 大量定义常量时,const 更高效(尤其在配置文件或框架启动阶段)
- define() 因支持运行时名称,适合插件系统、条件注册常量等场景
- 两者定义后均不可修改,尝试重新定义 const 或 define 同名常量都会触发 E_NOTICE 或致命错误(取决于是否已存在)
兼容性与编码风格建议
现代 PHP(>=7.0)应优先使用 const:语义清晰、IDE 支持好、自动补全强、支持命名空间原生语法。define() 仅保留在需要动态名称或兼容老版本(如 PHP 5.3–5.5)的极少数场景。
- 类常量、接口常量、trait 常量 —— 只能用 const
- 配置项(如 DB_HOST)—— 推荐 const(命名空间 + 大写蛇形)
- 需根据环境拼接常量名(如 "CACHE_TYPE_" . $env)—— 才考虑 define()
- PSR-12 编码规范明确鼓励 const 定义常量,未提及 define()
本质不是“选哪个更好”,而是“哪个更适合当前需求”。const 负责结构化、静态、可预测的常量;define() 解决运行时、动态、向后兼容的特殊需要。











