home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

PHP/Tips/parse_ini_fileで値に記号を使う時のPHP4<>5間の相違点

PHP/Tips/parse_ini_fileで値に記号を使う時のPHP4<>5間の相違点

PHP / Tips / parse_ini_fileで値に記号を使う時のPHP4<>5間の相違点
id: 757 所有者: msakamoto-sf    作成日: 2010-08-26 22:25:18
カテゴリ: PHP 

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などを使う方向で今後は考えていきたいです。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2010-08-26 22:44:47
md5:55c3aa6b0247d7a1e0748e740979b6bf
sha1:0c8f6ff7357b607e1c366dc573b3a2dd944a1a64
コメント
コメントを投稿するにはログインして下さい。