ThinkPHP 6.x/8.x 仅自动加载预设名文件(如app.php)、环境配置、模块级配置、runtime/config.php及extra声明的自定义文件;wechat.php等需在app.php中显式声明'extra'=>['wechat']才生效,且加载时机在入口初期,修改PHP文件不热更新。

会自动加载,但有明确范围和前提条件——不是 config/ 下所有 .php 文件都算数。
哪些文件会被自动加载
ThinkPHP(6.x / 8.x)启动时,会按固定顺序扫描并加载以下几类文件:
-
app.php、database.php、cache.php、view.php等框架预设名称的文件(位于config/目录下),默认全部加载 - 环境配置文件,如
config/dev.php或config/prod.php,仅当APP_ENV=dev且APP_DEBUG=true时才加载 - 模块级配置,如
config/admin/config.php,仅在访问 admin 模块时按需加载 - runtime 生成的
runtime/config.php,由Config::set()持久化写入后生效,重启不丢失
自定义配置文件(比如 wechat.php)不会自动加载
直接往 config/ 下丢一个 wechat.php,框架完全无视它——这不是 bug,是设计如此。
- 必须在
config/app.php中显式声明:'extra' => ['wechat'] - 声明后,框架才会去加载
config/wechat.php,且它优先级高于app.php但低于环境配置 - 多应用模式下,每个应用的
config/是独立的,确认当前应用目录下真有这个文件,而不是只放在根 config/ 里 - 如果改过
config_path()或提前调用Config::set('path', ...),extra可能失效
为什么删文件或加 if 判断来“跳过”配置不可靠
有人想让本地开发的 wechat.php 不在生产环境加载,于是写 if (APP_ENV === 'dev') { return [...]; } ——这看似合理,实则埋雷:
立即学习“PHP免费学习笔记(深入)”;
- 框架加载配置时不做运行时判断,整个文件被
require执行,return后数组没导出,Config::get('wechat.appid')直接返回null - 部署脚本可能覆盖文件,或 CI/CD 流程中未同步环境判断逻辑
- 更稳的方式是:用
.env控制开关,配置文件里统一读env('WECHAT_ENABLED', false),再决定是否合并子配置
真正容易被忽略的是加载时机——所有自动加载都在入口文件执行初期完成,一旦 App::run() 开始,再改 config/ 下的文件内容也不会生效,必须重启服务或清空 runtime/config.php。动态配置只能靠 Config::set() 写进 runtime,别指望改个 PHP 文件就能热更新。



















