【PHP8.x】INI_SCANNER_RAW定数の使い方
INI_SCANNER_RAW定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
INI_SCANNER_RAW定数は、PHPのiniファイルを解析する際の挙動を制御するオプションを表す定数です。この定数は、主にparse_ini_file()関数やparse_ini_string()関数で、iniファイルやini形式の文字列を連想配列として読み込む際に利用されます。
通常、これらの関数はiniファイル内の値を読み込む際、例えば"true", "false", "on", "off", "none"といったキーワードや、数値形式の文字列に対して、それぞれPHPの適切なデータ型(ブール値、整数、浮動小数点数など)に自動的に変換します。しかし、INI_SCANNER_RAW定数を指定して解析を行うと、このような自動的な型変換は行われず、すべての値が文字列としてそのまま保持されます。
これは、iniファイルに定義された値が、PHPによって意図しないデータ型に変換されてしまうのを避けたい場合に非常に有効です。例えば、my_option = trueという設定があった場合、INI_SCANNER_RAWを指定しないとPHPのブール値trueとしてパースされますが、この定数を指定すると文字列の"true"としてパースされます。このように、設定値を厳密に文字列として扱いたい場合や、後続のプログラムで明示的に型変換を行いたい場合に、INI_SCANNER_RAWは柔軟な設定値の処理を可能にします。
構文(syntax)
1<?php 2var_dump(INI_SCANNER_RAW); 3?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
INI_SCANNER_RAWは、parse_ini_file() 関数などでINIファイルを解析する際に、設定値を文字列としてそのまま取得するための定数です。この定数を指定すると、設定値はエスケープシーケンスなどが展開されずに、元の文字列のまま返されます。
サンプルコード
INI_SCANNER_RAWで文字列をそのまま解析する
1<?php 2 3/** 4 * INI_SCANNER_RAW 定数の使用例を示す関数。 5 * 6 * この定数は parse_ini_string() や parse_ini_file() 関数で 7 * INI ファイルの値をどのように解析するかを制御します。 8 * INI_SCANNER_RAW を指定すると、INI ファイルの値は型変換されず、 9 * 未処理の文字列として扱われます。 10 * 11 * 例: "On" はブール値の true ではなく文字列の "On" として扱われ、 12 * 数値も文字列として扱われます。 13 */ 14function demonstrateIniScannerRaw(): void 15{ 16 // 解析対象のINI形式の文字列を定義 17 // ここでは、ブール値、文字列、数値、配列の例を含めます。 18 $iniString = <<<'EOT' 19boolean_setting = On 20string_setting = "Hello PHP" 21number_setting = 12345 22array_setting[] = item1 23array_setting[] = item2 24EOT; 25 26 echo "--- parse_ini_string() (デフォルトの動作) ---\n"; 27 // INI_SCANNER_RAW を指定しない場合 (デフォルトの動作): 28 // "On" はブール値の true に、数値は整数に変換されます。 29 // ダブルクォートで囲まれた文字列のクォートは削除されます。 30 $parsedNormal = parse_ini_string($iniString, false); 31 var_dump($parsedNormal); 32 echo "\n"; 33 34 echo "--- parse_ini_string() with INI_SCANNER_RAW ---\n"; 35 // INI_SCANNER_RAW を指定した場合: 36 // 全てのINI値が未処理の文字列として扱われます。 37 // "On" は文字列の "On" に、数値も文字列 "12345" になります。 38 // ダブルクォートで囲まれた文字列のクォートもそのまま残ります。 39 $parsedRaw = parse_ini_string($iniString, false, INI_SCANNER_RAW); 40 var_dump($parsedRaw); 41 echo "\n"; 42} 43 44// 関数を実行し、INI_SCANNER_RAW の効果を出力 45demonstrateIniScannerRaw(); 46
PHPのINI_SCANNER_RAWは、parse_ini_string()やparse_ini_file()関数でINI形式のデータを解析する際の挙動を制御する定数です。この定数を関数の第三引数に指定すると、INIファイル内の値はPHPによる型変換が行われず、全てが未加工の文字列として扱われます。
通常、PHPは"On"をブール値のtrueに、"12345"を整数に変換し、ダブルクォートも除去して解析します。しかし、INI_SCANNER_RAWを使用すると、"On"は文字列"On"として、"12345"も文字列"12345"として、またダブルクォートも維持された文字列として値が取得されます。
サンプルコードでは、INI_SCANNER_RAWを指定しない場合のデフォルト動作(PHPが型変換)と、指定した場合(生の文字列として取得)の違いをvar_dumpの結果で比較しています。この定数自体に引数はなく、内部的にint型の値を持ちます。INI形式のデータを加工前の文字列として厳密に扱いたい場合に非常に役立ちます。
INI_SCANNER_RAW定数を使用すると、parse_ini_string()などの関数でINIファイルを解析する際、値の自動的な型変換を抑制し、全てを未加工の文字列として扱います。デフォルトでは「On」がブール値、数値は整数に変換され、文字列の引用符も除去されますが、この定数を使うと全て文字列のまま保持されます。INIファイルを厳密にテキストとして取得したい場合に活用しますが、取得後のプログラムで必要な型変換はご自身で行う必要があります。意図しないデータ型によるエラーを防ぐため、その特性を理解し、適切に使い分けましょう。
PHP INI_SCANNER_RAW で生文字列を取得する
1<?php 2 3/** 4 * INI_SCANNER_RAW 定数の使用例と、parse_ini_string() におけるその影響を示します。 5 * 6 * INI_SCANNER_RAW は、INI ファイルや文字列をパースする際に、 7 * "true", "false", "yes", "no", "null" などの特殊な文字列や数値を 8 * PHPのデータ型に変換せず、そのまま文字列として扱うよう指定するモードです。 9 * これは、INI ファイルの内容を厳密に文字列として取得したい場合に特に有用です。 10 * 11 * キーワードの 'php_ini_scan_dir' はPHPの内部的なINIファイルスキャン処理を指しますが、 12 * ユーザーが直接呼び出す関数ではありません。しかし、この定数は、 13 * PHPがINIファイルを「スキャン」して読み込む際の動作モードの一つとして理解できます。 14 */ 15function demonstrateIniScannerRaw(): void 16{ 17 // サンプルINI設定文字列を定義します。 18 // 通常のINIパースでは、特殊な値がPHPのデータ型に変換されます。 19 $iniString = <<<INI 20 my_boolean_true = "true" 21 my_boolean_false = "false" 22 my_null_value = "null" 23 my_number_string = "12345" 24 my_plain_string = "Hello World" 25 INI; 26 27 echo "--- INI_SCANNER_NORMAL (デフォルト挙動) ---" . PHP_EOL; 28 // デフォルトモード(INI_SCANNER_NORMALと同じ)でINI文字列をパースします。 29 // このモードでは、値が適切なPHPのデータ型に自動変換されます。 30 $normalConfig = parse_ini_string($iniString); 31 foreach ($normalConfig as $key => $value) { 32 echo sprintf("キー: %-20s 値: %-15s (型: %s)", $key, var_export($value, true), get_debug_type($value)) . PHP_EOL; 33 } 34 35 echo PHP_EOL . "--- INI_SCANNER_RAW ---" . PHP_EOL; 36 // INI_SCANNER_RAW モードでINI文字列をパースします。 37 // このモードでは、すべての値が文字列として扱われ、自動変換は行われません。 38 $rawConfig = parse_ini_string($iniString, false, INI_SCANNER_RAW); 39 foreach ($rawConfig as $key => $value) { 40 echo sprintf("キー: %-20s 値: %-15s (型: %s)", $key, var_export($value, true), get_debug_type($value)) . PHP_EOL; 41 } 42} 43 44// 関数を実行して、INI_SCANNER_RAW の動作を確認します。 45demonstrateIniScannerRaw(); 46
INI_SCANNER_RAWは、PHP 8で導入された定数で、INI形式のファイルや文字列をPHPで解析する際に、値の変換方法を指定するモードの一つです。
この定数は主にparse_ini_string()やparse_ini_file()といった関数と組み合わせて使用されます。PHPがINIファイルをパースする際、通常(デフォルトモード)は、"true", "false", "null", "123"といった特定の文字列を、それぞれ論理値(true/false)、NULL、数値(123)など、適切なPHPのデータ型に自動的に変換します。
しかし、INI_SCANNER_RAWモードを指定すると、PHPはこれらの特殊な文字列や数値をPHPのデータ型に自動変換せず、記述された内容をすべて文字列として取得します。これにより、INIファイルに設定された値をPHPが解釈する前の「生の」文字列として厳密に扱いたい場合に非常に有用です。
サンプルコードでは、まずデフォルトの挙動でINI文字列をパースし、値が自動変換されて取得される様子を示しています。次にINI_SCANNER_RAWを指定して同じ文字列をパースすると、すべての値が文字列型として取得されることが確認できます。
この定数自体は引数を取りませんが、その戻り値はint型であり、PHP内部でパースモードを識別するために使われます。php_ini_scan_dirというキーワードは、PHPのINIファイルスキャン処理全般を指しますが、INI_SCANNER_RAWはこのスキャン時における値の解釈方法を制御するモードの一つとして理解できます。
INI_SCANNER_RAWは、INIファイルやINI形式の文字列を読み込む際に、すべての値をPHPのデータ型に自動変換せず、厳密に文字列として取得したい場合に指定する定数です。この定数を使わないデフォルトの挙動では、「true」「false」といった文字列や数字が、それぞれPHPのブーリアン型や数値型に自動的に変換されます。
そのため、設定値の型を厳密に文字列で保持したい場合や、PHPによる自動型変換が意図しない挙動を引き起こす可能性がある場合に活用してください。利用する際は、読み込んだ後に必要な型への手動変換が必要になる場合があることを理解しておく必要があります。php_ini_scan_dirというキーワードはPHP内部のINIファイル読み込み処理に関連しており、この定数がその動作モードの一つとして機能します。