绝大多数时候该用 const,仅运行时确定值或条件块中定义时才用 define;const 必须在顶层或类中声明,不能在 if/foreach/函数内;命名空间和类中必须用 const,define 会污染全局;const 值限编译期常量,define 可接运行时表达式。

绝大多数时候该用 const,只有运行时才确定值、或需在条件块里定义时,才轮到 define。
const 不能写在 if / foreach / 函数里,否则直接报语法错误
这是最常踩的坑——不是运行时报错,而是解析阶段就失败。PHP 把 const 当作编译期语言结构,要求它必须出现在顶层作用域或类中。
-
if (true) { const DEBUG = true; }→ 解析失败,SyntaxError -
function init() { const API_VERSION = 'v2'; }→ 同样非法 -
define('DEBUG', true)在以上任意位置都合法,因为它是函数调用 - 典型适用场景:读取
getenv('APP_ENV')或配置文件后决定是否启用调试日志
命名空间和类中必须用 const,define 会污染全局
在 namespace AppConfig; 里写 const DB_PORT = 3306;,实际注册的是 AppConfigDB_PORT;而 define('DB_PORT', 3306) 注册的永远是全局 DB_PORT,跟命名空间无关。
- 类内只能用
const:class Db { const TIMEOUT = 5000; }✅;define('TIMEOUT', 5000)❌(语法错误) - 想在命名空间下用
define模拟命名空间常量?得手动拼前缀:define('App\Config\DB_HOST', 'localhost'),但use const AppConfigDB_HOST仍拉不到它 - Composer 多包共存时,
define冲突风险高,const天然隔离
值类型和动态性:const 只认字面量和编译期常量,define 接收一切运行时表达式
const 的右边必须是“一眼能算出结果”的东西;define 的右边只要执行时不抛错就行。
立即学习“PHP免费学习笔记(深入)”;
- ✅
const ROOT = __DIR__;(__DIR__是编译期常量) - ❌
const ROOT = dirname(__FILE__);(函数调用,编译器不放行) - ✅
define('CACHE_DIR', sys_get_temp_dir() . '/cache');(运行时拼路径没问题) - ✅
for ($i = 0; $i (名字和值都可动态生成) - ⚠️
const BIT_5 = 1 在 PHP 5.6+ 是合法的,但别依赖——它本质是编译器对简单位运算的特例支持,不是通用规则
大小写敏感性和可见性问题:const 严格区分大小写,define 可选忽略
写 const ENV = 'prod'; 后,env 就是 undefined;而 define('ENV', 'prod', true) 允许你用 env、Env、ENV 都能访问。
-
const名字必须是合法标识符:const API-KEY = 'x';❌(含减号);const API_KEY = 'x';✅ -
define名字可以是任意字符串:define('API-KEY', 'x');✅(但不推荐,易引发歧义) - 最容易被忽略的一点:
const定义后若没正确加载文件或没写全命名空间路径,就会报undefined constant——这不是语法错,是作用域或加载链断了



















