可以在parse_ini_file配置文件中使用math吗?如果没有,是否有推荐的解决方法?
$ini = parse_ini_file("config.ini");
的config.ini
MAX_FILE_SIZE = 100*pow(2,20) ;100 MB
答案 0 :(得分:0)
我不相信这是可行的,也可能是推荐的。但是,你可以做的一件事就是解决方法,但遗憾的是,首先使用配置文件的实际价值是使用常量:
define( 'MAX_FILE_SIZE' , 100*pow(2,20) );
然后在ini文件中使用常量。
答案 1 :(得分:0)
我找到了解决方法!
$a = parse_ini_file('a.ini', false, INI_SCANNER_RAW);
来自PHP doc:
If INI_SCANNER_RAW is supplied, then option values will not be parsed.
因此,您可以收集整个数组,然后创建一个foreach循环,并对值使用eval
。
检查我的代码:(知道错误,不删除eval_next_line,但现在我必须去。周一我会解决这个问题。直到那个,如果你有时间的话,你也可以修复它。无论如何,回合发生。是的,错误是,我有两次eval_next_line键,所以我需要修复它。无论如何,星期一。)
define('EVAL_NEXT_LINE', 'eval_next_line');
//Default removing the eval_next_lines
$removeEvals = true;
$options = parse_ini_file('a.ini', false, INI_SCANNER_RAW);
if (array_key_exists("remove_evals", $options)) {
if (empty($options['remove_evals']) || strtolower($options['remove_evals']) == 'no') {
$removeEvals = false;
}
}
$i = 0;
$evalNextLine = false;
foreach ($options as $key => $value) {
if ($evalNextLine === true) {
$options[$key] = eval("return " . $value .";");
$evalNextLine = false;
}
if ($key == EVAL_NEXT_LINE && ($value || strtolower($options[EVAL_NEXT_LINE] = 'yes'))) {
$evalNextLine = true;
if ($removeEvals) {
unset($options[$i]);
//$i--;
}
}
$i++;
}
var_dump($options);
我的a.ini
是:
[Parse options]
remove_evals = 1;
[Somethings]
eval_next_line = true;
myvar = round(2.5);
abc = xyz;
eval_next_line = true;
myvar2 = 100*pow(2,20);
[Somthing others]
anythig = true;
答案 2 :(得分:0)
您在ini文件中给出的数学运算会因为您使用保留字符(?{}|&~![()^"
)而引发错误。一个解决方法,虽然“有风险”(因为使用eval()
),但是;
MAX_FILE_SIZE = 100*2;
MAX_FILE_SIZE_POW = 20;
$ini = parse_ini_file('config.ini');
eval('$base = '. $ini['MAX_FILE_SIZE'] .';');
eval('$ini["MAX_FILE_SIZE"] = '. bcpow( $base, $ini['MAX_FILE_SIZE_POW'], 2) .';');
echo sprintf("%f", $ini['MAX_FILE_SIZE']);
<强>缺点强>
eval()
我们正在使用sprintf
,因此我们可以控制输出。没有它我们会得到1.048576E+46
。