Env::get() 默认值必须显式传入且不可为 null,否则数据库连接失败或 SQL 报错;端口、布尔值等需类型匹配;.env 格式错误会导致默认值“白设”;修改后须手动清缓存。

Env::get() 的第二个参数就是默认值,必须显式传入——不传会返回 null,而很多配置项(比如数据库密码、前缀)传 null 会导致连接失败或 SQL 报错。
Env::get() 默认值必须写,且不能为 null
ThinkPHP 的配置文件(如 config/database.php)里调用 Env::get('DB_HOST', '127.0.0.1') 是标准写法。省略第二个参数看似“可选”,实际等于把关键配置暴露给运行时异常:
-
Env::get('DB_PWD')返回null,PDO 连接时可能抛出SQLSTATE[HY000] [1045] Access denied -
Env::get('DB_PREFIX')返回null,生成表名时变成NULLusers,查询直接报错 - 空字符串
''比null安全得多,尤其对前缀、编码、超时等字段
默认值类型要匹配实际使用场景
不同字段对默认值的语义要求不同,硬套 '' 或 '127.0.0.1' 可能埋坑:
- 端口号应为整数:
Env::get('DB_PORT', 3306),别写成'3306'(字符串在 PDO 中可能被忽略) - 布尔开关建议用
false或true:Env::get('DB_DEBUG', false),避免'false'被当字符串解析 - 数组类配置(如 Redis host 列表)无法用
Env::get()直接读取,.env 不支持嵌套,得拆成REDIS_HOST1、REDIS_HOST2再手动组装
.env 文件格式错误会让默认值“白设”
即使代码里写了 Env::get('DB_HOST', '127.0.0.1'),如果 .env 文件某行格式不对,vlucas/phpdotenv 会静默跳过整行,最终还是走默认值——你以为改了配置,其实没生效:
立即学习“PHP免费学习笔记(深入)”;
- 等号两侧有空格:❌
DB_HOST = 127.0.0.1→ 必须写成 ✅DB_HOST=127.0.0.1 - 值含
@、!、空格但没加单引号:❌DB_PWD=pass@123→ 必须写成 ✅DB_PWD='pass@123' - 变量名用了小写或中划线:❌
db_host=127.0.0.1或db-host=127.0.0.1→Env::get('db_host')返回false - 注释写在行尾:❌
DB_HOST=127.0.0.1 # local→ 注释必须独占一行且以#开头
Env::get 和 env() 函数的默认值行为一致
Env::get() 和全局函数 env() 底层共用同一套逻辑,传参规则完全相同。但要注意调用位置:
- 必须在配置文件(如
config/database.php)里调用,不能在控制器里补救——控制器里env('DB_HOST')能读出来,不代表数据库配置已更新 - 变量名是扁平的,
Env::get('database.username')实际查的是.env里的DATABASE_USERNAME,不是database.username(TP6 不支持点号嵌套) - 若需兼容 TP5 风格的下划线命名(如
database_username),确保.env里定义的是该形式,并在代码中对应调用Env::get('database_username')
最常被忽略的一点:修改 .env 后,必须手动清缓存(php think config:clear),否则旧配置仍被加载——这个动作比改代码还关键。



















