Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】INI_SCANNER_NORMAL定数の使い方

INI_SCANNER_NORMAL定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

INI_SCANNER_NORMAL定数は、PHPのini設定ファイルを解析する際の標準的な動作モードを指定するために使用される定数です。iniファイルとは、アプリケーションの設定情報を記述するためによく用いられるシンプルなテキスト形式のファイルで、セクション名とキーと値のペアで構成されます。この定数は、主にparse_ini_file関数やparse_ini_string関数など、PHPでini形式のファイルを読み込む際に、その解析方法を制御するために第2引数として用いられます。

具体的にINI_SCANNER_NORMALモードが指定されると、PHPはiniファイルの内容を「セクション名」(例:[database])と「キーと値のペア」(例:host = localhost)として正確に認識し、それらを連想配列の形式で返します。例えば、[database]セクション内のhost = localhostという記述は、最終的に['database']['host'] = 'localhost'のような形でPHPの配列としてアクセスできるようになります。これにより、開発者はアプリケーションの設定情報を構造化された形式でPHPスクリプト内に簡単に取り込むことができます。

この定数の特徴として、iniファイル内に記述された変数展開(例:${DATABASE_HOST}のような記述)は行われず、そのような記述は単なる文字列として扱われる点が挙げられます。そのため、ファイルに書かれたそのままの内容を忠実に読み込みたい場合に適しています。

INI_SCANNER_NORMALは、iniファイルを解析する関数のデフォルトのモードでもあり、特別な設定変更が必要ない限り、このモードでiniファイルが読み込まれます。アプリケーションの一般的な設定ファイルや構成ファイルを読み込む際に、最も頻繁に利用される標準的な解析モードとして機能します。この定数を使用することで、PHPアプリケーションが外部設定ファイルから情報を取得し、その動作を柔軟に設定することが可能になります。

構文(syntax)

1<?php
2$ini_string = "setting = value";
3$config = parse_ini_string($ini_string, false, INI_SCANNER_NORMAL);
4?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

INI_SCANNER_NORMAL は、PHPの parse_ini_file() 関数などで使用される整数定数です。この定数は、INIファイルを通常の形式で解析することを指示するために使用され、その戻り値は整数 1 です。

サンプルコード

PHP INI_SCANNER_NORMAL で設定を文字列として解析する

1<?php
2
3/**
4 * Demonstrates the usage of the INI_SCANNER_NORMAL constant with parse_ini_file().
5 *
6 * This function illustrates how to parse an INI-style configuration file
7 * into an associative array. With INI_SCANNER_NORMAL, all values are
8 * treated as literal strings, preventing automatic type conversions
9 * (e.g., "true" remains the string "true", not boolean true).
10 *
11 * This is the default and most common scanning mode, useful for system
12 * engineers who need predictable string-based interpretation of INI settings.
13 *
14 * @param string $iniContent The content of the INI file to parse.
15 * @return array|false An associative array representing the parsed INI data, or false on failure.
16 */
17function parseIniFileNormal(string $iniContent): array|false
18{
19    // Create a unique temporary file path for demonstration
20    $tempIniFile = sys_get_temp_dir() . '/example_config_' . uniqid() . '.ini';
21
22    // Write the provided INI content to the temporary file
23    if (file_put_contents($tempIniFile, $iniContent) === false) {
24        error_log("Error: Could not create temporary INI file at {$tempIniFile}");
25        return false;
26    }
27
28    echo "--- Parsing INI file using INI_SCANNER_NORMAL ---" . PHP_EOL;
29    echo "Temporary file created: {$tempIniFile}" . PHP_EOL;
30
31    // Parse the INI file.
32    // - The second argument `true` ensures that sections (e.g., [database])
33    //   are processed and become keys in the returned array.
34    // - INI_SCANNER_NORMAL is explicitly passed as the third argument.
35    //   It tells PHP to treat all values as strings, without special interpretation.
36    $config = parse_ini_file($tempIniFile, true, INI_SCANNER_NORMAL);
37
38    // Clean up the temporary file immediately after parsing
39    if (file_exists($tempIniFile)) {
40        if (!unlink($tempIniFile)) {
41            error_log("Warning: Could not delete temporary INI file '{$tempIniFile}'.");
42        } else {
43            echo "Temporary file deleted: {$tempIniFile}" . PHP_EOL;
44        }
45    }
46
47    return $config;
48}
49
50// --- Example Usage ---
51
52// Define sample INI content for parsing
53$sampleIniContent = <<<INI
54; Configuration for a hypothetical application
55[database]
56host = "localhost"
57port = 3306
58username = db_user
59password = "secret_password_123"
60ssl_enabled = true ; With INI_SCANNER_NORMAL, this is the string "true"
61
62[application]
63name = "My awesome App"
64version = "1.0.0"
65debug_mode = 1 ; With INI_SCANNER_NORMAL, this is the string "1"
66log_level = INFO
67INI;
68
69// Call the function to parse the INI content
70$parsedConfig = parseIniFileNormal($sampleIniContent);
71
72if ($parsedConfig !== false) {
73    echo PHP_EOL . "--- Parsed Configuration Output ---" . PHP_EOL;
74    print_r($parsedConfig);
75
76    echo PHP_EOL . "--- Accessing Specific Values (all treated as strings) ---" . PHP_EOL;
77    echo "Database Host: " . ($parsedConfig['database']['host'] ?? 'N/A') . PHP_EOL;
78    echo "Application Name: " . ($parsedConfig['application']['name'] ?? 'N/A') . PHP_EOL;
79    echo "SSL Enabled Status (string): " . ($parsedConfig['database']['ssl_enabled'] ?? 'N/A') . PHP_EOL;
80    echo "Debug Mode (string): " . ($parsedConfig['application']['debug_mode'] ?? 'N/A') . PHP_EOL;
81
82    echo PHP_EOL . "Note: Values like 'true' and '1' are kept as strings because INI_SCANNER_NORMAL " .
83         "prevents automatic type conversion." . PHP_EOL;
84    echo "If automatic type conversion is desired, use INI_SCANNER_RAW." . PHP_EOL;
85
86} else {
87    echo PHP_EOL . "Failed to parse INI content due to an error." . PHP_EOL;
88}

INI_SCANNER_NORMALは、PHPでINI形式の設定ファイルを解析する際に、値の解釈方法を指定するための定数です。この定数自体はint型の値を持っています。

主にparse_ini_file()関数やparse_ini_string()関数の第3引数に指定して使用されます。INI_SCANNER_NORMALを指定すると、INIファイル内のすべての値が「文字列」として扱われます。例えば、「true」や「1」といった値も、PHPが自動的に真偽値や数値に変換することなく、それぞれ文字列の"true""1"として読み込まれます。

これは、システムの設定ファイルなどを扱う際に、値の型が意図せず変更されることを防ぎ、常に予測可能な文字列ベースでデータを扱いたい場合に特に有用です。

サンプルコードでは、parseIniFileNormal関数内でparse_ini_file()関数を呼び出し、第3引数にINI_SCANNER_NORMALを明示的に渡しています。この関数は、引数で渡されたINIコンテンツを一時ファイルに書き込み、その内容を解析します。parse_ini_file()関数の第2引数にtrueを指定することで、[database]のようなセクションごとにデータをグループ化し、連想配列として返します。解析が成功すると、INIファイルの内容を表現する連想配列が戻り値として返されますが、解析に失敗した場合はfalseが返されます。この動作により、設定値が全て文字列として扱われていることを確認できます。

INI_SCANNER_NORMALは、INIファイル内の値を全て文字列として解釈するモードです。そのため、「true」や数字の「1」なども、自動的に真偽値や数値に変換されず、そのまま文字列「"true"」や「"1"」として取得される点に特に注意が必要です。自動的な型変換を期待する場合は、INI_SCANNER_RAWなどの他のスキャンモードの利用を検討してください。

サンプルコードでは一時ファイルを生成していますが、これはデモンストレーション目的です。実際のアプリケーションでは、既存のINIファイルのパスをparse_ini_file関数に直接指定して利用するのが一般的です。また、parse_ini_fileは解析に失敗するとfalseを返すため、結果を利用する前に必ず戻り値を確認するエラーハンドリングを実装してください。

PHPでINIファイルから設定を読み込み適用する

1<?php
2
3/**
4 * INIファイルから設定を読み込み、PHPのINI設定を更新する関数。
5 *
6 * システムエンジニアを目指す初心者向けに、INIファイルの解析 (`parse_ini_file`と`INI_SCANNER_NORMAL`) と
7 * PHP実行時設定の変更 (`ini_set`) の方法を示します。
8 * 特にエラー表示設定 (`display_errors`) のON/OFFを外部ファイルから制御する例です。
9 *
10 * @param string $configFilePath 読み込むINIファイルのパス。
11 * @return void
12 */
13function applyIniSettingsFromFile(string $configFilePath): void
14{
15    // INIファイルが存在しない場合は生成します。
16    // このコードを単体で実行可能にするための便宜的な処理です。
17    if (!file_exists($configFilePath)) {
18        file_put_contents(
19            $configFilePath,
20            "; 開発環境用のINI設定例\n" .
21            "display_errors = 1\n" .       // エラー表示を有効にする設定
22            "error_reporting = E_ALL\n"    // 全てのエラーを報告する設定
23        );
24        echo "INFO: 設定ファイル '{$configFilePath}' を生成しました。\n";
25    }
26
27    // INIファイルを解析し、設定を連想配列として取得します。
28    // INI_SCANNER_NORMAL は、INIファイルを標準的な方法でスキャンするモードです。
29    // コメントやセクションも通常通り解釈されます。
30    // 第2引数の 'false' は、セクションを多次元配列にしないことを意味します。
31    $iniSettings = parse_ini_file($configFilePath, false, INI_SCANNER_NORMAL);
32
33    if ($iniSettings === false) {
34        echo "エラー: 設定ファイル '{$configFilePath}' の解析に失敗しました。\n";
35        return;
36    }
37
38    echo "--- INIファイルから読み込んだ設定 ---\n";
39    print_r($iniSettings);
40    echo "------------------------------------\n\n";
41
42    // 読み込んだ設定をPHPのINI設定に適用します。
43    foreach ($iniSettings as $key => $value) {
44        // 現在の設定値を取得して表示
45        $currentValue = ini_get($key);
46        // 新しい設定値を適用
47        ini_set($key, (string)$value);
48        echo "INI設定 '{$key}' を '{$currentValue}' から '{$value}' に変更しました。\n";
49    }
50
51    // 設定が正しく適用されたか確認するために、'display_errors' の現在の値を確認します。
52    echo "\n現在の 'display_errors' 設定: " . ini_get('display_errors') . "\n";
53
54    // エラー表示が有効になっているか確認するためのテストです。
55    echo "\n--- エラー表示テスト ---\n";
56    // 意図的に未定義の変数を参照し、警告エラーを発生させます。
57    // display_errors = 1 であれば、この警告がブラウザやコンソールに出力されます。
58    trigger_error("これはテストエラーです。display_errorsが有効な場合、このメッセージが表示されます。", E_USER_WARNING);
59    echo "エラー表示テスト終了。\n";
60}
61
62// スクリプト実行部
63$configFile = 'config.ini';
64
65// 上記で定義した関数を実行し、INI設定を適用します。
66applyIniSettingsFromFile($configFile);
67
68// 生成した一時ファイルを削除する場合は、以下のコメントを解除してください。
69// unlink($configFile);
70
71?>

このサンプルコードは、外部のINIファイルからPHPの設定を読み込み、実行時にPHPの動作設定を変更する方法をシステムエンジニアを目指す初心者向けに示しています。applyIniSettingsFromFile関数は、まず指定されたINIファイルが存在しない場合に、エラー表示を有効にするdisplay_errors = 1などの設定を含むファイルを作成します。

その後、parse_ini_file関数を用いてINIファイルを解析し、その内容をPHPの連想配列として取得します。ここで第3引数にINI_SCANNER_NORMAL定数が指定されています。INI_SCANNER_NORMALは引数を持たない整数値を返す定数で、parse_ini_fileにINIファイルを標準的な方法でスキャンし、コメントやセクションも通常通り解釈するよう指示します。parse_ini_file関数はファイルパスとオプションの引数を受け取り、解析結果を連想配列で返しますが、解析に失敗した場合はfalseを返します。

解析して得られた設定値は、foreachループで一つずつ処理され、ini_set関数によってPHPの現在の実行時設定に適用されます。ini_set関数は設定名と新しい設定値を文字列で引数として受け取り、変更前の設定値を返します。この例では、特にdisplay_errorsの設定を外部ファイルで制御し、エラー表示を有効にする様子を確認できます。設定適用後には、ini_get関数で現在のdisplay_errorsの値を表示し、意図的な警告エラーを発生させることで、設定が正しく反映され、エラーが表示されることを確認しています。

このサンプルコードで利用されるini_set関数は、現在のスクリプト実行中にのみPHPの設定を一時的に変更するものです。サーバー全体や次回の実行に永続的な影響を与えるものではない点にご留意ください。特にdisplay_errorsを「1」に設定すると、エラーメッセージがそのままユーザーに表示され、システム内部の情報が漏洩するセキュリティリスクとなるため、本番環境では必ず「0」に設定するようにしてください。parse_ini_fileで外部ファイルを読み込む際は、ファイルパスの検証や不正な設定値への対策を講じ、セキュリティを確保することが重要です。INI_SCANNER_NORMALはINIファイルを標準的な方法で解析するモードですが、他のスキャナーモードとの違いも理解しておくと役立ちます。設定ファイルの解析や適用に失敗した場合のエラーハンドリングも適切に行いましょう。

関連コンテンツ

関連IT用語

関連プログラミング言語