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

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

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

作成日: 更新日:

基本的な使い方

GLOB_ERR定数は、PHPのglob()関数におけるエラー処理の挙動を制御するための定数です。この定数は、ファイルシステムを検索するglob()関数が、アクセス権限がないディレクトリなど、何らかの問題に遭遇した場合の動作を決定します。通常、glob()関数はエラーに直面しても処理を続行しようとしますが、GLOB_ERR定数を指定することで、その挙動を変更できます。

具体的には、glob()関数にGLOB_ERR定数をフラグとして渡すと、関数はエラーが発生した時点で即座に処理を中断し、エラーを示す結果を返します。例えば、検索対象のディレクトリにアクセスする権限がないといったエラーが発生した場合、GLOB_ERRを使用していなければ、関数はエラーを無視して処理を続けようとします。しかし、GLOB_ERRが指定されていれば、エラー発生時に検索を中止し、プログラムはエラーを検知して適切に対応できるようになります。

この定数を利用することで、ファイルシステムの検索中に発生する可能性のある問題を早期に把握し、プログラムで適切なエラーハンドリングを行うことが可能になります。これにより、予期せぬ動作を防ぎ、より堅牢なアプリケーションを開発する上で重要な役割を果たします。

構文(syntax)

1<?php
2echo GLOB_ERR;

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP glob エラーハンドリング入門

1<?php
2
3// システムエンジニアを目指す初心者向けに、PHPのglob()関数とGLOB_ERR定数の使い方を説明します。
4// GLOB_ERR定数は、glob()関数がファイルやディレクトリを探索する際に、アクセス権がないなどのエラーが発生した場合に
5// PHPの警告(Warning)を表示させるためのフラグ(設定値)です。
6
7// 警告を確実に表示させるために、エラー報告レベルを設定します。
8// 実際の運用環境では、これらの設定はphp.iniで行うか、より詳細なエラーハンドリングを実装します。
9error_reporting(E_ALL);      // 全てのPHPエラー、警告、通知を表示
10ini_set('display_errors', '1'); // 画面にエラーを表示
11
12/**
13 * glob() 関数と GLOB_ERR 定数を使って、ファイル探索時のエラーハンドリングの概念を実演します。
14 * GLOB_ERR の主な目的は、アクセス制限のあるディレクトリへのアクセス失敗時に警告を出すことです。
15 */
16function demonstrateGlobErrHandling(): void
17{
18    echo "--- glob() 関数と GLOB_ERR 定数の実演 ---" . PHP_EOL . PHP_EOL;
19
20    // 存在しないディレクトリのパターンを指定します。
21    // このパターンは通常存在しないか、アクセス制限があることを想定しています。
22    // この例では実際に「Permission denied」の警告を発生させることはできませんが、
23    // GLOB_ERR がどのような状況で役立つかを説明します。
24    $pattern = '/path/to/nonexistent_or_restricted_dir/*';
25    echo "探索パターン: '{$pattern}'" . PHP_EOL;
26    echo "(このパターンは通常存在しないか、アクセス制限があるディレクトリを想定しています。)" . PHP_EOL . PHP_EOL;
27
28    // 1. GLOB_ERR フラグなしで glob() を実行した場合
29    echo "--- GLOB_ERR フラグなしでの実行 ---" . PHP_EOL;
30    echo "アクセスできないディレクトリがあっても、通常、PHPの警告は表示されません。" . PHP_EOL;
31    $filesWithoutErr = glob($pattern);
32
33    if ($filesWithoutErr === false) {
34        // glob() が false を返すのは、メモリ不足などの致命的なエラーの場合です。
35        // アクセス権の問題では通常 false は返さず、空の配列を返します。
36        echo "glob() 関数が致命的なエラーを返しました。" . PHP_EOL;
37    } elseif (empty($filesWithoutErr)) {
38        echo "指定されたパターンに一致するファイルは見つかりませんでした。" . PHP_EOL;
39    } else {
40        echo "見つかったファイル:" . PHP_EOL;
41        foreach ($filesWithoutErr as $file) {
42            echo "- {$file}" . PHP_EOL;
43        }
44    }
45    echo PHP_EOL;
46
47    // 2. GLOB_ERR フラグありで glob() を実行した場合
48    echo "--- GLOB_ERR フラグありでの実行 ---" . PHP_EOL;
49    echo "もしアクセスできないディレクトリが見つかった場合、PHPの警告が表示されます。" . PHP_EOL;
50    echo "(このコードでは警告は発生しませんが、その挙動を説明します。)" . PHP_EOL;
51    $filesWithErr = glob($pattern, GLOB_ERR);
52
53    if ($filesWithErr === false) {
54        echo "glob() 関数が致命的なエラーを返しました (GLOB_ERR フラグあり)。" . PHP_EOL;
55    } elseif (empty($filesWithErr)) {
56        echo "指定されたパターンに一致するファイルは見つかりませんでした (GLOB_ERR フラグあり)。" . PHP_EOL;
57    } else {
58        echo "見つかったファイル (GLOB_ERR フラグあり):" . PHP_EOL;
59        foreach ($filesWithErr as $file) {
60            echo "- {$file}" . PHP_EOL;
61        }
62    }
63    echo PHP_EOL;
64
65    echo "--- GLOB_ERR が役立つシナリオ ---" . PHP_EOL;
66    echo "例えば、'/var/log/*' のように広範囲なシステムディレクトリを探索する際、" . PHP_EOL;
67    echo "一部のサブディレクトリにスクリプトの実行ユーザーがアクセスできない場合、" . PHP_EOL;
68    echo "GLOB_ERR フラグが指定されていれば 'Permission denied' の警告が出力され、" . PHP_EOL;
69    echo "問題の特定とデバッグに役立ちます。" . PHP_EOL . PHP_EOL;
70
71    echo "--- 想定されるPHPの警告の例 ---" . PHP_EOL;
72    echo "PHP Warning:  glob(): Unable to open directory /path/to/restricted_dir - Permission denied in " . __FILE__ . " on line XX" . PHP_EOL;
73    echo "(これは実際にこのコードで出力される警告ではなく、どのような警告が出るかの例です。)" . PHP_EOL;
74}
75
76// 関数を実行して、GLOB_ERR の動作を確認します。
77demonstrateGlobErrHandling();
78
79?>

PHPのGLOB_ERRは、ファイルシステムを探索するglob()関数と共に使用される重要な定数です。glob()関数は、指定されたパターンに一致するファイルやディレクトリを検索し、そのリストを返しますが、その探索中に問題が発生することがあります。

このGLOB_ERR定数をglob()関数の第二引数に指定すると、ファイルシステムへのアクセス中に発生するエラー、例えばアクセス権の不足による「Permission denied」のような問題に対して、PHPが明確な警告(Warning)を表示するようになります。

通常、glob()関数はアクセスできないディレクトリに遭遇しても、警告を出さずに結果を空にするなどして処理を続行することがあります。しかし、GLOB_ERRフラグを有効にすることで、アクセス拒否のような潜在的な問題がPHPの警告として表面化し、プログラムのデバッグやトラブルシューティングに役立ちます。特に、システム全体を対象とするような広範囲なファイル探索を行う際に、隠れたアクセス権の問題を発見しやすくなります。

GLOB_ERR定数自体はフラグであり、特定の引数や戻り値は持ちません。これはglob()関数の動作を設定するための値として機能し、エラー発生時の情報提供を強化する役割を担っています。これにより、システムエンジニアを目指す方々が、ファイル探索関連の問題をより効率的に特定し、解決できる手助けとなります。

GLOB_ERRは、glob()関数がアクセスできないディレクトリに遭遇した際にPHPの警告を表示させるためのフラグです。このフラグを設定しても、関数自体がfalseを返すのは、メモリ不足など致命的なエラーの場合であり、アクセス権の問題では警告が表示され、通常は空の配列を返しますので、戻り値の確認には注意が必要です。

サンプルコードのように警告を画面表示する設定は開発時のデバッグ向けであり、実際の運用環境ではセキュリティやパフォーマンスの観点から、画面表示ではなくエラーログに出力する設定が一般的です。glob()利用時には、スクリプト実行ユーザーのファイルシステムアクセス権限が重要であり、意図しない警告が発生しないよう事前に確認することが大切です。警告が出た場合は、そのメッセージから問題箇所を特定し、適切に対処しましょう。

PHP glob_braceとGLOB_ERRでファイル検索する

1<?php
2
3/**
4 * PHPのglob()関数でGLOB_ERR定数とGLOB_BRACE定数を使用する例。
5 *
6 * GLOB_ERRは、glob()関数がファイルシステムの検索中にエラーに遭遇した場合に、
7 * PHPの警告を発生させるために使用されます。
8 * GLOB_BRACEは、`{}`(ブレース)を使ったパターン展開を有効にするために使用されます。
9 *
10 * このサンプルコードは、PHP 8で動作します。
11 */
12function demonstrateGlobConstants(): void
13{
14    // 検索対象となる一時ファイルとディレクトリを作成します。
15    // これらはスクリプトの実行後に削除されます。
16    $tempDir = 'temp_glob_search_dir';
17    if (!is_dir($tempDir)) {
18        mkdir($tempDir);
19    }
20    file_put_contents($tempDir . '/document_report.txt', 'レポートA');
21    file_put_contents($tempDir . '/document_log.log', 'ログB');
22    file_put_contents($tempDir . '/data_config.ini', '設定C');
23    file_put_contents($tempDir . '/other_file.tmp', '一時ファイル');
24
25    echo "--- glob()関数でファイル検索を実行 ---\n";
26
27    // glob()関数を使用して、指定されたパターンに一致するファイルパスを検索します。
28    //
29    // 第一引数: 検索パターン
30    //   '{$tempDir}/{document_*,data_*}.{txt,log,ini}'
31    //   - {$tempDir}: 作成した一時ディレクトリのパス。
32    //   - {document_*,data_*}: GLOB_BRACEによって 'document_' で始まるファイル名、
33    //     または 'data_' で始まるファイル名に展開されます。
34    //   - {txt,log,ini}: GLOB_BRACEによって '.txt', '.log', '.ini' のいずれかの拡張子に展開されます。
35    //
36    // 第二引数: フラグ (GLOB_BRACE | GLOB_ERR)
37    //   - GLOB_BRACE: ブレース(波括弧){} を使用したパターン展開を有効にします。
38    //     例: "{a,b}.txt" は "a.txt" と "b.txt" の両方にマッチします。
39    //   - GLOB_ERR: glob()関数がファイルシステムのアクセスなどでエラーが発生した場合に、
40    //     PHPの警告 (Warning) を発生させます。通常、エラーが発生しない場合は警告は表示されません。
41    //     glob()は失敗した場合に false を返しますが、このフラグはその際に警告も出力するようになります。
42    $pattern = $tempDir . '/{document_*,data_*}.{txt,log,ini}';
43    $files = glob($pattern, GLOB_BRACE | GLOB_ERR);
44
45    if ($files === false) {
46        echo "glob()関数がエラーにより失敗しました。\n";
47        echo "GLOB_ERRフラグが指定されているため、PHPの警告が発生した可能性があります"
48             . "(エラーログやコンソールを確認してください)。\n";
49    } elseif (empty($files)) {
50        echo "指定されたパターン '" . $pattern . "' に一致するファイルは見つかりませんでした。\n";
51    } else {
52        echo "指定されたパターン '" . $pattern . "' に一致するファイルが見つかりました:\n";
53        foreach ($files as $file) {
54            echo "- " . $file . "\n";
55        }
56    }
57
58    // クリーンアップ: 作成したファイルとディレクトリを削除します。
59    @unlink($tempDir . '/document_report.txt');
60    @unlink($tempDir . '/document_log.log');
61    @unlink($tempDir . '/data_config.ini');
62    @unlink($tempDir . '/other_file.tmp');
63    @rmdir($tempDir);
64}
65
66// 関数を実行して、glob()関数の動作と定数の効果を確認します。
67demonstrateGlobConstants();
68
69?>

PHPのglob()関数は、指定されたパターンに一致するファイルやディレクトリのパスを検索するために使用されます。この関数は第一引数に検索パターン、第二引数に検索オプションを示すフラグを渡します。

今回紹介するGLOB_ERR定数は、glob()関数がファイルシステムのアクセス中にエラーが発生した場合に、PHPの警告(Warning)を発生させるためのオプションです。通常、エラー発生時にはglob()関数自体がfalseを返しますが、GLOB_ERRフラグを併用することで、エラーが起きたことを警告として通知し、デバッグの助けとなります。

サンプルコードでは、このGLOB_ERR定数と、ブレース{}を使ったパターン展開を可能にするGLOB_BRACE定数を組み合わせて使用しています。GLOB_BRACEを用いることで、{document_*,data_*}.{txt,log,ini}のように、複数のパターンを一度に指定して柔軟な検索が可能です。glob()関数は、パターンに一致したファイルパスのリストを配列として返しますが、一致するファイルがなければ空の配列を、検索エラーが発生した場合はfalseを返します。このサンプルは、一時ファイルを作成してglob()の動作を実演し、これらの定数を活用して目的のファイルを効率的に見つける方法を示しています。

glob()関数はファイルシステムを検索するため、アクセス権限によってはエラーが発生する可能性があります。GLOB_ERRフラグを併用すると、エラー時にPHPの警告が出力され、問題特定の一助となりますので、エラーログ等で確認してください。glob()falseを返した場合、処理が失敗しているため、必ずエラーハンドリングを行うようにしましょう。GLOB_BRACEフラグは、波括弧{}で複数のパターンをまとめて指定できる機能を提供し、柔軟なファイル検索に役立ちます。このフラグを忘れると波括弧は通常の文字として扱われ、期待通りの検索結果が得られません。外部からの入力値を検索パターンに使用する際は、意図しないファイルアクセスを防ぐため、厳重なバリデーションを推奨します。

関連コンテンツ

関連IT用語

関連プログラミング言語