parse_ini_file()の挙動がPHP4とPHP5の間で微妙に変わったりしています。自分は、値に記号(特に"$")を含んでいるケースで挙動の差異に遭遇しました。
php.netのマニュアル上では、「ini ファイル上の値に英数字ではないものがある場合、 ダブルクォート(")で囲う必要があります。」と記述されています。ところがPHP4の場合、特にダブルクォートで囲まなくとも読み込めるケースがあるため、マニュアルの記述に気づかずそのまま書いてしまい、PHP5に移行して上手く読めなくなりトラブルの原因となりました。
例:
test.ini:
key1 = value1 key2 = %value2% abc key3 = %1$s %2$s [%3$s] %4$s key4[] = E_USER_WARNING key4[] = "foo bar"
parse_ini_file.php:
<?php $r = parse_ini_file('test.ini'); var_dump($r);
PHP 4.4.9 (WinXP SP3):
> php parse_ini_file.php array(4) { ["key1"]=> string(6) "value1" ["key2"]=> string(12) "%value2% abc" ["key3"]=> string(21) "%1$s %2$s [%3$s] %4$s" ["key4[]"]=> string(7) "foo bar" }
※PHP4ではまだ配列形式のkeyがサポートされていない
PHP 5.2.10 (WinXP SP3):
> php parse_ini_file.php bool(false) ↓エラーメッセージ [26-Aug-2010 22:36:35] PHP Warning: Error parsing test.ini on line 3 \ in parse_ini_file.php on line 3
マニュアルの記述に従い、key3の値を""で囲めば、PHP5でも正常に読み込めます。
key1 = value1 key2 = %value2% abc key3 = "%1$s %2$s [%3$s] %4$s" key4[] = E_USER_WARNING key4[] = "foo bar"
PHP 4.4.9 (WinXP SP3):
> php parse_ini_file.php array(4) { ["key1"]=> string(6) "value1" ["key2"]=> string(12) "%value2% abc" ["key3"]=> string(21) "%1$s %2$s [%3$s] %4$s" ["key4[]"]=> string(7) "foo bar" }
PHP 5.2.10 (WinXP SP3):
> php parse_ini_file.php array(4) { ["key1"]=> string(6) "value1" ["key2"]=> string(12) "%value2% abc" ["key3"]=> string(21) "%1$s %2$s [%3$s] %4$s" ["key4"]=> array(2) { [0]=> string(3) "512" [1]=> string(7) "foo bar" } }
お察しの方もおられると思いますが、pear/LogのFileHandler、lineFormatをINIファイルで設定出来るようにしていたのです。PHP4の時代に作成したのをこの度PHP5に移し替えていたのですが、PHP4環境では問題なく出力されるのに、PHP5環境に移すとエラーになる、ということで調べてみた次第です。
他の言語と設定ファイルを共有したい場合はINIファイルが便利であることは確かですが、値のフォーマットについて今後のバージョンアップ時に何かしらトラブルが発生するかも知れないというリスクを考慮する必要がありそうです。
CakePHPやsymfonyなど、有名どころのフレームワークはいずれもINIファイルを使っていません。PHPだけで使うのであれば素直にPHPの配列を使うか、次点でYAMLなどを使う方向で今後は考えていきたいです。