const 有明确作用域,define 始终全局;const 需文件加载且受命名空间限制,define 可动态定义、支持运行时计算和条件定义。

新手常以为“写了 const 就能到处用”,结果运行时报 undefined constant,其实问题不在语法,而在作用域没对上、文件没加载或命名空间漏写了前缀。核心原则是:const 有明确归属,define 没有归属——它永远往全局塞。
const 的作用域由声明位置严格决定
const 不是“全局变量”,它的可见范围取决于写在哪:
- 写在
class里 → 属于该类,必须用ClassName::CONST_NAME或self::CONST_NAME访问 - 写在
namespace App\Config;下 → 实际注册为App\Config\CONST_NAME,外部要用全名或use const App\Config\CONST_NAME - 写在文件最外层(无 namespace)→ 注册为全局常量,可直接使用
常见错误:在 namespace Admin; 中写了 const TITLE = '后台';,却在另一个文件里直接写 echo TITLE; —— 这会报错,因为 PHP 找不到全局的 TITLE,它只存在于 Admin\TITLE。
define 始终注册到全局,无视命名空间
无论你当前在哪个命名空间、函数或 if 分支里调用 define,它定义的常量都进入全局符号表:
-
namespace App; define('DB_HOST', 'localhost');→ 实际定义的是全局DB_HOST,不是App\DB_HOST - 想模拟命名空间效果?只能手动拼:
define('App\Config\ROOT', __DIR__);,但这样use const App\Config\ROOT仍无效,因为use const只识别const定义的命名空间常量 - 多个 Composer 包都
define('VERSION', '1.0');?后加载的会触发警告,甚至覆盖前一个
加载顺序不当,const 就“不存在”
const 是编译期结构,但它的值要能被访问,前提是定义它的文件已被 require 或 include:
- 常量定义在
config.php里,但主脚本没require 'config.php';→ 直接用就报undefined constant - 定义在命名空间文件中,却忘了
use const或写错命名空间路径,比如把App\Config\TIMEOUT写成App\TIMEOUT - PHP 版本低于 5.6?全局
const不支持,只有类内const可用;此时define是唯一兼容选择
什么时候必须用 define?
不是“哪个更好”,而是“const 做不了,才轮到 define”:
- 需要在
if、foreach或函数体内动态决定是否定义:if (getenv('APP_ENV') === 'dev') { define('DEBUG', true); } - 值依赖运行时计算:
define('CACHE_DIR', sys_get_temp_dir() . '/myapp');(const不允许函数调用) - 需要动态生成常量名:
for ($i = 0; $i - 需大小写不敏感(不推荐,PHP 7.3+ 已废弃):
define('ENV', 'prod', false);→env和ENV都可用(但defined('env')仍返回false)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











