parse_ini_file() 在 PHP 7.4 中可用但需谨慎使用:必须同时传 true 和 INI_SCANNER_RAW 才能保留点号键名、避免类型转换、防止节覆盖;否则易丢数据、变类型、混节。

直接说结论:parse_ini_file() 在 PHP 7.4 中能用,但默认行为容易踩坑——键名带点(database.host)、值含 on/off/123、节名重复或含数字前缀时,结果常和预期不符。关键不是“能不能读”,而是“怎么读才不丢数据、不变类型、不混节”。
为什么 parse_ini_file() 读不出 db.host 这种键?
因为默认解析器把点号当分隔符,直接转成下划线(db_host),甚至整个键被忽略。这不是 bug,是 INI_SCANNER_NORMAL 模式的设计逻辑:它只处理标准节 + 简单键名。
- 必须同时传
true和INI_SCANNER_RAW才能保留原始键名:parse_ini_file('config.ini', true, INI_SCANNER_RAW) - 只传
true不加INI_SCANNER_RAW:节结构有了,但db.host = localhost仍会变成db_host => 'localhost' - 只传
INI_SCANNER_RAW不加true:所有节被扁平合并,[db]和[cache]的同名键会相互覆盖
parse_ini_file() 把密码 pass = on 变成 true 怎么办?
这是 INI_SCANNER_NORMAL(默认)和 INI_SCANNER_TYPED 的自动类型转换行为:on、yes、true 都转布尔 true;123 转整型;null 转 null。对密码、URL、路径这类字符串,这很危险。
- 敏感字符串配置(如
password、api_key、url)一律用INI_SCANNER_RAW模式 -
INI_SCANNER_TYPED适合明确需要类型推断的场景(如debug = true、timeout = 30),但要确认所有值都符合预期转换规则 - 如果 ini 文件里写了
pass = "on"(加了双引号),INI_SCANNER_NORMAL会保留字符串,但INI_SCANNER_TYPED仍可能转布尔——加引号不保险,模式才是关键
PHP 7.4 下 parse_ini_file() 的兼容性注意点
PHP 7.4 完全支持 parse_ini_file(),但有三个实际限制容易被忽略:
立即学习“PHP免费学习笔记(深入)”;
- 文件路径必须可读,且不能是相对路径依赖
getcwd()—— 建议用__DIR__ . '/config.ini'显式拼接 - ini 文件中键名禁用
{}、|、"、~、!等字符,否则解析失败返回false,不会抛异常 - 以
0开头的节名或键名(如[001_api])会被当八进制处理,变成十进制数键(1),建议统一用引号包裹:["001_api"]
最常被跳过的细节:parse_ini_file() 返回 false 时不报错,也不提示哪一行出问题。检查返回值是否为数组,再用 is_array() 判定,否则后续代码可能直接崩在 $cfg['db']['host'] 上。



















