全局配置用const(php 5.6+),运行时动态定义或条件判断用define();类内一律用const。define()唯一不可替代场景是在函数、循环、if中动态定义常量,因const是编译期指令且位置固定。

define() 和 const 都能定义常量,但它们不是随便换着用的——选错会导致语法错误、作用域失效或 PHP 版本兼容问题。直接说结论:全局配置用 const(PHP 5.6+),运行时动态定义或需条件判断时用 define();类内一律用 const。
什么时候必须用 define()
它唯一不可替代的场景,是「在函数、循环、if 分支里动态定义常量」。因为 const 是编译期指令,PHP 解析时就要求位置固定。
-
define()支持表达式作为值:比如define('CACHE_TTL', time() + 3600); - 可配合条件逻辑:比如
if (ENV === 'prod') { define('DEBUG', false); } - 第三个参数
true可让常量名不区分大小写(如define('api_key', 'xxx', true)),但会破坏命名一致性,线上环境禁止使用 - 返回布尔值,可用于容错:例如
if (!define('DB_HOST', $_ENV['DB_HOST'] ?? 'localhost')) { throw new Exception('Failed to define DB_HOST'); }
为什么 const 在全局作用域更推荐
从 PHP 5.6 开始,const 不再只限于类内,也能用于文件顶层(即全局作用域)。它比 define() 更快、更安全,且支持数组和标量类型。
- 语法简洁:
const APP_ENV = 'staging';,不能加括号、不能写表达式(如const NOW = time();会报错) - 强制大小写敏感,避免
APP_ENV和app_env混淆 - 支持数组常量:
const SUPPORTED_LOCALES = ['zh-CN', 'en-US'];(PHP 5.6+) - 不支持在函数体内使用:
function foo() { const X = 1; }→ 致命错误Parse error: syntax error, unexpected 'const'
类中定义常量只能用 const
define() 在类内部完全无效,连语法检查都过不去。类常量是静态绑定的,且默认 public,不可被子类修改(除非用 protected const 或 private const,PHP 7.1+)。
- 正确写法:
class Config { const VERSION = '2.1.0'; public const MODE = 'strict'; } - 访问方式:
Config::VERSION或(new Config())::MODE(PHP 8.1+ 支持只读属性,但常量仍是首选) - 不能用变量动态调用类常量名:
$cls = 'Config'; echo $cls::VERSION;是合法的(PHP 5.3+),但define("{$cls}::ANOTHER", ...)会失败 - 类常量不支持表达式初始化,也不能引用其他常量(如
const BASE = __DIR__;可以,但const PATH = BASE . '/cache';不行)
读取和检测常量容易踩的坑
未定义的常量不会返回 null 或 false,而是直接触发 E_WARNING(PHP 7.2+)或 Fatal error(PHP 8.0+),所以任何动态使用前必须校验。
- 检查是否存在:
if (defined('API_TIMEOUT')) { ... },不能用isset()(它只对变量有效) - 动态获取值:
$name = 'DB_PORT'; $val = constant($name);,但若$name拼错或未定义,constant()会报错,建议包一层defined() - 魔术常量如
__FILE__、__LINE__是只读的,不能被define()覆盖,也不在get_defined_constants()的user分类里 -
get_defined_constants(true)返回多维数组,user键下才是你定义的常量,别直接print_r(get_defined_constants())看花眼
const 和 define() 表面只是语法差异,实际涉及执行时机、作用域规则和错误行为。最常被忽略的是:在条件分支里误用 const 导致解析失败,以及在 PHP 8+ 中未 defined() 就直接使用动态常量名引发致命错误。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











