优先用const——编译时解析、性能高、支持命名空间和类;仅当需在if/foreach/函数内动态定义时才用define(),因其是运行时函数调用且无作用域限制。

绝大多数时候该用 const——它在编译时解析、性能高、语义清晰,且天然支持命名空间和类;只有当你需要在 if、foreach 或函数体内动态决定是否定义常量时,define() 才是唯一合法选择。
const 不能出现在条件或函数内部,否则直接语法错误
const 是语言结构,不是函数,必须在顶层作用域(文件最外层)或类定义体中声明。一旦写在 if、for、函数里,PHP 解析器会在编译阶段报错,根本不会执行到运行时。
-
if (true) { const DEBUG = true; }→ 报Parse error: syntax error, unexpected 'const' -
function init() { const VERSION = '1.0'; }→ 同样语法错误 - 但
define('DEBUG', true)在上述任意位置都合法,因为它是运行时函数调用
命名空间中用 const 定义的常量有作用域,define 默认注册到全局
在 namespace App; 下写 const API_TIMEOUT = 5000;,实际注册的是 App\API_TIMEOUT;而 define('API_TIMEOUT', 3000) 注册的永远是全局 API_TIMEOUT,和当前命名空间无关。
- 外部想用命名空间下的
const,得写全名App\API_TIMEOUT或加use const App\API_TIMEOUT; -
define定义的常量无法用use const导入,也不受命名空间隔离保护 - 多个 Composer 包各自
define('CONFIG', ...)会互相覆盖或触发重复定义警告
值类型限制:const 不接受函数调用,define 可以
const 的值必须是编译期可确定的静态表达式(PHP 5.6+ 支持数组、简单运算如 10 * 1024),但不能含任何函数调用;define 的值在运行时求值,所以能用 getenv()、dirname(__FILE__)、sys_get_temp_dir() 等。
-
const ROOT = __DIR__;✅(__DIR__是编译期常量) -
const ROOT = dirname(__FILE__);❌(函数调用,编译时报错) -
define('CACHE_DIR', sys_get_temp_dir() . '/cache');✅(只要运行时不抛异常即可)
为什么写了 const 还报 “undefined constant”?大概率不是语法问题
这个错误几乎从不来自 const 写法本身,而是加载顺序或作用域没对上:
- 命名空间没写全:在
namespace App\Config;里定义了const DB_PORT = 3306;,却直接写DB_PORT调用 → 应该用App\Config\DB_PORT - 文件没被
require或include:常量定义在未加载的文件里,自然不可见 - PHP 版本低于 5.6:全局
const在 PHP 5.5 及以下不支持,只允许在类中使用;此时define是兼容性兜底方案
最易忽略的一点:const 定义后完全不可撤销或重定义,而 define 虽然也不允许重复定义(会触发 E_NOTICE),但因是函数调用,更容易在调试时误判为“没生效”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











