PHP定义常量:define与const区别详解
const更适合定义常量——更简洁、支持命名空间与类内使用、编译期解析性能更优;define()仅适用于运行时动态构造常量名,且存在命名、作用域和大小写等多重限制。
const 更适合定义常量——更简洁、支持命名空间与类内使用、编译期解析性能更优;define() 仅适用于运行时动态构造常量名,且存在命名、作用域和大小写等多重限制。

define() 和 const 哪个更适合定义常量?
绝大多数情况下,const 更推荐——它更简洁、支持命名空间、可被类内使用,且在编译期解析,性能略优。但 define() 是唯一能在运行时动态构造常量名的选项。
define() 的典型误用场景
常见错误是试图用 define() 定义带表达式的值,比如 define('MAX_RETRY', 3 + 2)——这本身合法,但容易让人误以为它能“延迟求值”。其实它和 const 一样,只执行一次赋值,不支持函数调用(如 define('NOW', time()) 在定义时就求值了,不是每次读取都刷新)。
- 不能在类定义体外用
define()创建类常量(必须用const) - 不能在命名空间声明后直接写
define('MyNS\LOG_LEVEL', 'debug')—— PHP 会报错,因为define()不识别命名空间语法 - 常量名若含非法字符(如空格、中划线),
define()允许字符串传入,但后续引用时无法用My-CONST这种写法,只能用constant('My-CONST')
const 定义常量的三个层级差异
const 可用于全局、命名空间、类内部,但行为有关键区别:
- 全局作用域:直接写
const API_TIMEOUT = 5000;,等价于define('API_TIMEOUT', 5000) - 命名空间内:必须加
namespace前缀,如namespace App\Config;
,此时完整名称是
const DB_HOST = 'localhost';App\Config\DB_HOST - 类内:写成
class Config {,访问需用
const VERSION = '2.1';
}Config::VERSION,且支持public/private修饰(PHP 7.1+)
常量名大小写与访问陷阱
PHP 默认定义的是**区分大小写的常量**,但 define() 第三个参数设为 true 可创建大小写不敏感常量——这是极少见的用法,且有隐患:
- 不敏感常量无法用
const语法定义 - IDE 和静态分析工具通常忽略这种模式,容易导致拼写错误不被发现
- 调用
defined('DB_HOST')和defined('db_host')都返回true,但DB_HOST直接使用时若拼错,仍会触发 notice(因为解析器按字面量找,不走不敏感逻辑)
真正该关注的是:所有常量一旦定义就不能修改或重定义,define() 重复定义会警告,const 重复定义直接 fatal error。没有“重新定义”这回事。
Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。
Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。
Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。
Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。















