PHP 5.3: parse_ini_file()関数の非互換

parse_ini_file()関数が PHP 5.3 で結構動作が変わっています。

アンダースコア「_」で始まる定数が展開されない

test.ini

TEST = _ABC

test.php

<?php
define('_ABC', '定数_ABC');

$config = parse_ini_file('./test.ini', TRUE);
var_dump($config);

PHP 5.2以前では、

array(1) {
  ["TEST"]=>
  string(10) "定数_ABC"
}

PHP 5.3では、

array(1) {
  ["TEST"]=>
  string(4) "_ABC"
}

キーに非ASCII文字を使用できない

まあ、こんなことをしてる人はいないと思いますが。

test.ini

テスト = _ABC

test.php

<?php
$config = parse_ini_file('./test.ini', TRUE);
var_dump($config);

PHP 5.2以前では、

array(1) {
  ["テスト"]=>
  string(4) "_ABC"
}

PHP 5.3では、

array(0) {
}

セクション名が定数の場合も展開される

test.ini

[TEST]
TEST = ABC

test.php

<?php
define('TEST', 'XYZ');

$config = parse_ini_file('./test.ini', TRUE);
var_dump($config);

PHP 5.2以前では、

array(1) {
  ["TEST"]=>
  array(1) {
    ["TEST"]=>
    string(3) "ABC"
  }
}

PHP 5.3では、

array(1) {
  ["XYZ"]=>
  array(1) {
    ["TEST"]=>
    string(3) "ABC"
  }
}

PHP 5.3 では、以下のように第3引数に INI_SCANNER_RAW を指定すれば、定数の展開はされなくなるので、セクション名の展開もされなくなる。しかし、この場合、値の定数も展開されなくなる。

$config = parse_ini_file('./test.ini', TRUE, INI_SCANNER_RAW);

値を囲んだシングルクォート「'」が考慮される

test.ini

TEST = 'ABC'

test.php

<?php
$config = parse_ini_file('./test.ini', TRUE);
var_dump($config);

PHP 5.2以前では、

array(1) {
  ["TEST"]=>
  string(5) "'ABC'"
}

PHP 5.3では、

array(1) {
  ["TEST"]=>
  string(3) "ABC"
}