define()在php中用于定义常量,语法为define(常量名,值,$case_insensitive),第三个参数默认false即区分大小写,设为true则不区分;常量定义后不可修改,名称须以字母或下划线开头。

define() 在 PHP 8.5.5 中默认区分大小写,这不是新行为,而是从 PHP 早期版本就延续下来的默认规则。
你看到“区分大小写”,是因为没显式传入第三个参数 case_insensitive,它默认是 false。
define() 的第三个参数控制大小写敏感性
-
define('FOO', 'bar')→ 只能用FOO访问,foo或FoO会触发E_WARNING(“Use of undefined constant”) -
define('FOO', 'bar', true)→FOO、foo、Foo都能访问同一个常量
常见错误现象:
- 开发环境没开错误报告,
echo foo;看似“正常输出字符串 foo”,其实是把未定义常量当字面量解析(PHP 会把它当作字符串'foo',并抛E_NOTICE) - 测试时用
defined('foo')返回false,但误以为常量没定义成功,其实是大小写不匹配
为什么建议保持默认(即区分大小写)
- 命名一致性:常量名全大写是行业惯例,
MAX_RETRY和max_retry混用容易引发歧义 - 避免隐式降级:开启
case_insensitive = true后,defined('MAX_RETRY')和defined('max_retry')都返回true,但 IDE 或静态分析工具(如 PHPStan)可能无法识别小写形式,导致类型推导失败 - 兼容性风险:某些框架(如 Laravel 的 config 加载机制)依赖常量名精确匹配;若用不区分大小写的
define(),在命名空间或自动加载上下文中可能意外覆盖或冲突
const 和 define() 在大小写上的关键差异
-
const FOO = 'bar';—— 永远区分大小写,不接受大小写开关参数 -
define('FOO', 'bar', true)—— 是唯一能绕过大小写限制的方式,但仅限define() - 类常量(
class X { const FOO = 1; })和命名空间常量(namespace A; const FOO = 1;)也强制区分大小写,且不支持case_insensitive
实际开发中容易被忽略的一点:define() 的大小写行为只影响常量名的访问阶段,不影响定义本身。哪怕你写 define('Pi', 3.14, true),后续所有调用都必须拼写正确(如 Pi),只是允许你用 pi 或 PI 访问——但一旦项目里混用,排查时很难一眼看出是拼写问题还是逻辑问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











