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 可创建大小写不敏感常量——这是极少见的用法,且有隐患:
Avactis是一个强大的PHP在线购物系统拥有多个版本包括开源版本。它具备一个在线购物系统所需要的所有功能从产品到会员管理,订单和营销。可以无限分类和为产品指定任务数量的图片(支持自动生成缩略图)。使用自定义字段功能,让你可以更好地定义一个产品。该系统提供以非常灵活的方式来创建任意类型的促销活动如设置折扣代码,基于价格的折扣或基于数量的折扣等。
立即学习“PHP免费学习笔记(深入)”;
- 不敏感常量无法用
const语法定义 - IDE 和静态分析工具通常忽略这种模式,容易导致拼写错误不被发现
- 调用
defined('DB_HOST')和defined('db_host')都返回true,但DB_HOST直接使用时若拼错,仍会触发 notice(因为解析器按字面量找,不走不敏感逻辑)
真正该关注的是:所有常量一旦定义就不能修改或重定义,define() 重复定义会警告,const 重复定义直接 fatal error。没有“重新定义”这回事。










