ThinkPHP6中常量用于不可变全局标识(如路径、版本),须全大写+下划线命名,模板中用{:CONSTANT}输出;配置变量用于可调运行参数(如数据库名),以小写+下划线命名,模板中用{$Think.config.key}访问。

ThinkPHP6 中常量和配置变量用途不同、加载时机不同、使用场景也不同,混用容易出错。关键在于:常量用于不可变的全局标识(如路径、版本、开关),配置变量用于可动态调整的运行参数(如数据库名、缓存时间)。
常量定义与使用规范
常量必须全大写+下划线命名,定义后不可更改。框架内置常量(如 PHP_VERSION、DS、THINK_VERSION)可在模板中直接输出;自定义常量需手动定义并确保被自动加载:
- 在 app/common.php 中用 define('SITE_NAME', 'MyApp') 定义
- 确认 composer.json 的 autoload.files 包含该文件(默认已配)
- 模板中用 {:SITE_NAME} 输出,不能加括号或函数调用(如 {:site_name()} 或 {:defined('SITE_NAME')} 均无效)
- 框架未预加载的常量(如 APP_PATH)无法在模板中直接使用,需由控制器通过 assign() 传入
配置变量定义与读取方式
配置变量以小写+下划线命名,存储在 config/ 目录下的 PHP 文件中(如 config/app.php),属于键值对数组,不参与 PHP 常量机制:
- 读取用 config('app.app_name') 或简写 config('app_name')(若在 app 配置文件中)
- 模板中输出配置项用 {$Think.config.app_name},不是 {:APP_NAME}
- 配置支持多级嵌套,如 config('database.default') 对应 config/database.php 中的 'default' => 'mysql'
- 环境配置优先级:环境变量 > .env 文件 > config/ 下对应环境配置(如 config/config_dev.php)
模板中常见误用与规避方法
模板不是执行逻辑的地方,很多写法看似合理实则报错或静默失败:
立即学习“PHP免费学习笔记(深入)”;
- 不要在模板里判断常量值:{:APP_DEBUG ? 'DEV' : 'PROD'} 语法不支持,三元表达式和函数调用均被模板引擎忽略
- 不要混淆配置与常量:在 config/app.php 写 'site_title' => 'MySite' 后,不能用 {:SITE_TITLE},而应写 {$Think.config.site_title}
- 路径类常量慎用:如 APP_PATH、RUNTIME_PATH 默认不在模板作用域,需控制器显式 $this->assign('app_path', APP_PATH) 后才可用
- 系统变量可直接用:如 {$Think.server.HTTP_HOST}、{$Think.get.id}、{$Think.now} 等无需额外定义
开发调试建议
常量和配置修改后,务必清除运行时缓存再验证效果:
- 执行 php think clear 清除全部缓存
- 或指定清除:php think clear --path=runtime/config(仅清配置缓存)
- 检查 app/common.php 是否真被加载:可在其中加 echo 'loaded';die; 测试
- 查看当前生效配置:在控制器中 dump(config());,模板中用 {:dump(config())}(需开启调试模式)



















