PHP parse_ini_file()与手册不符及INI_SCANNER_TYPED模式下no键失效疑问
关于PHP parse_ini_file()的保留字与INI_SCANNER_TYPED模式问题解答
我来帮你理清这个parse_ini_file()的疑惑,分几个关键点拆解:
1. 测试命令的小错误
你写的测试命令里用了管道符|,这其实是个容易踩的坑:echo "no=1" > a.cfg是把内容写入文件,这个命令本身没有输出,管道符会把前一个命令的标准输出传给php,但php这里是要读取文件,不是读标准输入。正确的写法应该用&&来串联命令,确保文件写入完成后再执行php:
echo '"no"=1' > a.cfg && php -r 'print_r(parse_ini_file("a.cfg", false, INI_SCANNER_TYPED));'
注意这里我给键no加了双引号,这是解决问题的核心!
2. 保留字作为键的隐藏前提
手册说INI_SCANNER_TYPED模式允许no这类保留字作为键,但它没明确强调一个重要的INI语法规则:当键是保留字(或包含特殊字符)时,必须用双引号包裹。
默认情况下,INI解析器会把未加引号的no识别为值的保留字,而不是键。哪怕用了TYPED模式,这个语法规则依然存在——只有用双引号把键括起来,解析器才会把它当作普通键名处理,而不是值的关键字。
举个例子:
- 错误写法:
no=1→ 解析器会混乱,最终可能返回空数组或者直接忽略这个键 - 正确写法:
"no"=1→ TYPED模式下能正确解析出Array ( [no] => 1 )
3. 关于手册描述的“不符”
你觉得实际行为和手册描述不符,大概率是因为没注意到这个引号的要求。手册只提到TYPED模式允许保留字作为键,但省略了INI语法里对特殊键名的引号要求,这就导致了实际测试和描述的偏差。
另外再补充下TYPED模式的核心值转换逻辑:
- 保留字值会转为对应原生类型:
no/off/false→false,yes/on/true→true,null→null - 数字格式的字符串会自动转为整数或浮点数,空字符串则转为
null
内容的提问来源于stack exchange,提问作者forthrin
相关产品推荐
相关产品推荐

