即使使用INI_SCANNER_TYPED

时间:2019-06-21 16:27:44

标签: php parsing ini type-coercion

根据documentation

用作parse_ini_file()的第三个参数的INI_SCANNER_TYPED应该“在可能时”保留布尔值,空值和整数值。

但是,解析常量时,值将转换为字符串。该文档尚不清楚是否预期会发生这种情况。这当然是不可取的,我无法想象有一个有用的场景。当然,要进行字符串转换时,可以使用其他扫描类型吗?

例如,带有以下ini文件:

NUMBER = 1
TEXT = "1"
DEFINED_INTEGER_CONSTANT = FOO
DEFINED_BOOLEAN_CONSTANT = BAR
UNDEFINED_CONSTANT = BAZ

我使用以下php文件并在注释中获取输出

<?php
declare(strict_types=1);
define("FOO", 123);
define("BAR", true);

$ini_file = parse_ini_file(__DIR__ . '/test.ini', false, INI_SCANNER_TYPED);

foreach($ini_file as $key => $value) {
    define($key, $value);
}

var_dump(NUMBER); // => int(1)
var_dump(TEXT); // => string(1) "1"
var_dump(DEFINED_INTEGER_CONSTANT); // => string(3) "123"
var_dump(DEFINED_BOOLEAN_CONSTANT); // => "1"
var_dump(UNDEFINED_CONSTANT); // => "BAZ"

在第3和第4个示例中,我既不期望也不希望进行字符串转换。是否可以使用parse_ini_file解析常量而不进行字符串转换,还是需要以其他方式执行此操作?这与文档中的“如果可能”子句有关吗?是否出于某些原因无法在此处保留原始类型?

使用PHP 7.1版。

1 个答案:

答案 0 :(得分:0)

目前似乎还没有一种方法可以使parse_ini_file以预期的方式运行。

我已报告此错误,并且已将其验证为错误-参见here