.env文件不支持多维数组,因其仅解析KEY=VALUE扁平格式;ThinkPHP等框架依赖的vlucas/phpdotenv库会将DB.CONNECTIONS.MYSQL.HOST等写法视为字符串键名而非嵌套结构。

.env 文件本身不能直接写多维数组——它只支持扁平的键值对,解析器(如 vlucas/phpdotenv)根本不会识别方括号、点号或嵌套语法。
为什么 .env 解析器不支持多维结构
ThinkPHP 6/8 默认使用 vlucas/phpdotenv 加载 .env,该库按行扫描,只认 KEY=VALUE 格式。哪怕你写成 DB.CONNECTIONS.MYSQL.HOST=127.0.0.1 或 REDIS[host]=127.0.0.1,结果都是:整行被跳过,或者解析为字符串键名(如 "DB.CONNECTIONS.MYSQL.HOST"),不会自动转成 PHP 数组。
这不是 ThinkPHP 的限制,是 dotenv 协议本身的约束。
想实现“多维效果”,只能靠配置文件中拼装
真正起作用的是 config/database.php 这类 PHP 配置文件,它们可以读取多个 env() 变量,再组合成数组结构:
立即学习“PHP免费学习笔记(深入)”;
'connections' => [ 'mysql' => [ 'hostname' => env('DB_MYSQL_HOST', '127.0.0.1'), 'database' => env('DB_MYSQL_NAME', 'test'), ], 'pgsql' => [ 'hostname' => env('DB_PGSQL_HOST', 'localhost'), 'database' => env('DB_PGSQL_NAME', 'prod'), ], ]- 对应
.env里只需写四行扁平变量:DB_MYSQL_HOST=192.168.1.10、DB_MYSQL_NAME=app_dev、DB_PGSQL_HOST=pg.internal、DB_PGSQL_NAME=main - 如果某组配置项共用前缀(如所有 Redis 相关),可以用
env('REDIS_HOST')、env('REDIS_PORT')等批量读取,在配置文件里统一组装
别碰 .env 里的点号和方括号
这些写法看似直观,但实际会触发静默失败:
-
REDIS.HOST=127.0.0.1→ 解析为键名"REDIS.HOST"(含点号的字符串),不是['REDIS']['HOST'] -
LOG.LEVEL='debug'→ 同样只是单个字符串键,env('LOG.LEVEL')能取到值,但无法用env('LOG')['LEVEL']访问 -
APP.MODULES[]=admin或DB.SLAVES[0]=10.0.1.1→ 直接被忽略,dotenv 不识别这种语法
更危险的是:某些编辑器或 Git 工具会把带点号的键名当注释或无效行处理,导致部署后部分变量彻底丢失。
复杂配置建议改用 PHP 配置文件 + 条件加载
当配置项逻辑变重(比如根据 APP_ENV 动态启用不同缓存驱动、切换多套数据库连接策略),硬塞进 .env 只会让它越来越难维护。这时应该:
- 把环境标识(如
APP_ENV=prod)留在.env,用于控制加载路径 - 在
config/prod/cache.php这类文件里,用原生 PHP 写数组结构,甚至调用env()做条件判断 - 避免在
.env中重复写几十行类似CACHE_DRIVER_REDIS_HOST_1、CACHE_DRIVER_REDIS_HOST_2这种命名,可读性差且易出错
真正的多维能力不在 .env,而在你如何组织 PHP 配置文件和 env() 的组合方式。别指望一个纯文本文件承担结构化数据的职责。



















