

新闻资讯
技术教程const 更适合定义常量——更简洁、支持命名空间与类内使用、编译期解析性能更优;define() 仅适用于运行时动态构造常量名,且存在命名、作用域和大小写等多重限制。
绝大多数情况下,const 更推荐——它更简洁、支持命名空间、可被类内使用,且在编译期解析,性能略优。但 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 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 语法定义defined('DB_HOST') 和 defined('db_host') 都返回 true,但 DB_HOST 直接使用时若拼错,仍会触发 notice(因为解析器按字面量找,不走不敏感逻辑)真正该关注的是:所有常量一旦定义就不能修改或重定义,define() 重复定义会警告,const 重复定义直接 fatal error。没有“重新定义”这回事。