const 是编译期语言结构,必须在顶层作用域定义,支持命名空间和类;define() 是运行期函数,可动态定义、支持运行时计算,但默认全局且不支持类内定义。

PHP 中 const 和 define() 都能定义常量,但本质不同:一个是语言结构,一个是函数;一个在编译时生效,一个在运行时执行。选错不仅影响可读性,还可能引发语法错误或作用域混乱。
执行时机与定义位置限制
const 是编译期语言结构,必须出现在顶层作用域(即不在函数、循环、if 块内);define() 是运行期函数,可在任意合法执行位置调用。
-
const VERSION = '2.0';✅ 全局或命名空间顶层可用 -
if ($debug) { const DEBUG_MODE = true; }❌ 语法错误 -
if ($debug) { define('DEBUG_MODE', true); }✅ 合法,条件成立时才定义 -
function init() { define('RUNTIME_FLAG', microtime(true)); }✅ 可在函数中动态定义
命名空间与类中支持
const 天然支持命名空间和类作用域;define() 默认全局,即使写在命名空间里,也得手动拼全名才能归属该空间。
-
namespace App; const DB_HOST = '127.0.0.1';→ 实际是AppDB_HOST -
define('DB_HOST', '127.0.0.1');→ 全局常量DB_HOST,不属App -
define('App\DB_PORT', 3306);→ 手动加前缀才进入命名空间 -
class Config { const TIMEOUT = 30; }→ ✅ 唯一支持类内常量的方式
值与名称的灵活性
const 要求名称和值都为静态表达式(PHP 5.6+ 支持数组、标量运算等);define() 名称和值均可为运行时计算结果,更灵活。
立即学习“PHP免费学习笔记(深入)”;
-
const PI = 3.14159;✅const MAX = 100 * 2;✅(PHP 5.6+) -
const ROOT = __DIR__;❌ 函数调用不允许 -
define('ROOT', __DIR__);✅ 运行时获取路径 for ($i = 0; $i ✅ 动态生成常量名-
define('LOG_LEVEL', getenv('LOG_LEVEL') ?: 'info');✅ 依赖环境变量
版本支持与额外特性
define() 兼容 PHP 4 起所有版本;const 在全局作用域使用需 PHP ≥ 5.3.0,在类中使用从 PHP 5.0 就支持。两者在大小写敏感性上也有差异。
-
const NAME = 'value';→ 永远大小写敏感 -
define('NAME', 'value', true);→ 第三个参数设为true后,name、NaMe都可访问 - PHP 7.0+:两者均支持数组常量(
const COLORS = ['red', 'blue'];/define('COLORS', ['red', 'blue']);) - PHP 8.0+:未定义常量直接报
Error,不再静默转为字符串



















