【PHP8.x】GLOB_ONLYDIR定数の使い方
GLOB_ONLYDIR定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
GLOB_ONLYDIR定数は、PHPのファイルシステム操作において、指定したパターンに合致するディレクトリのみを検索結果として取得するために使用される定数です。これは、主にglob()関数と組み合わせて利用されます。glob()関数は、UNIXシェルのようなパターンマッチングを用いてファイルシステム上のパスを検索し、それらに一致するファイルやディレクトリのリストを返しますが、デフォルトではファイルとディレクトリの両方を含みます。
この定数GLOB_ONLYDIRをglob()関数の第2引数として渡すことで、検索パターンに一致したパスの中から、ファイルを除外し、ディレクトリパスのみを結果として受け取ることができます。例えば、特定の親ディレクトリ直下にあるすべてのサブディレクトリの一覧だけが必要な場合や、特定の条件を満たすディレクトリだけを処理したい場合に非常に役立ちます。これにより、余分なファイル情報を除外し、目的のディレクトリ情報に絞って効率的に処理を進めることが可能になります。システムがファイルとディレクトリを区別して操作する際、検索結果から必要な要素だけを抽出するための重要なオプションの一つとして機能します。
構文(syntax)
1glob('*', GLOB_ONLYDIR);
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
GLOB_ONLYDIR は、ファイル名だけでなくディレクトリ名も検索対象に含めることを指定するための定数です。その値は整数 1 です。
サンプルコード
PHP GLOB_ONLYDIR でサブディレクトリを一覧表示する
1<?php 2 3/** 4 * glob() 関数と GLOB_ONLYDIR 定数を使って、現在のディレクトリ内のサブディレクトリを一覧表示します。 5 * 6 * GLOB_ONLYDIR は、glob() 関数の結果をファイルではなくディレクトリのみに限定するための定数です。 7 * これにより、特定のパターンに一致するディレクトリだけを効率的に見つけることができます。 8 * 9 * 例: このスクリプトを実行するディレクトリにサブディレクトリ(例: 'test_dir', 'data' など)を作成してから 10 * 実行すると、それらのディレクトリ名が表示されます。 11 */ 12function listSubdirectoriesWithGlobOnlyDir(): void 13{ 14 echo "現在のディレクトリ内のサブディレクトリを検索中...\n"; 15 16 // glob() 関数は、指定されたパターンに一致するファイルやディレクトリのパスを配列で返します。 17 // '*' は現在のディレクトリ内のすべてのエントリ(ファイルとディレクトリ)を意味します。 18 // GLOB_ONLYDIR フラグを渡すことで、結果をディレクトリのみに絞り込みます。 19 $directories = glob('*', GLOB_ONLYDIR); 20 21 // 検索が失敗した場合 (例: 読み取り権限がない場合など) 22 if ($directories === false) { 23 echo "エラー: ディレクトリの検索に失敗しました。\n"; 24 return; 25 } 26 27 // サブディレクトリが見つからなかった場合 28 if (empty($directories)) { 29 echo "現在のディレクトリにはサブディレクトリが見つかりませんでした。\n"; 30 return; 31 } 32 33 echo "見つかったサブディレクトリ:\n"; 34 foreach ($directories as $dir) { 35 echo "- " . $dir . "\n"; 36 } 37} 38 39// 関数を実行して結果を表示します。 40listSubdirectoriesWithGlobOnlyDir(); 41 42?>
PHPのGLOB_ONLYDIRは、ファイルシステム上のディレクトリを検索する際に用いられる特別な定数です。この定数自体には引数はなく、内部的には整数値(int)として定義されています。
主にglob()関数と組み合わせて使用され、glob()関数が指定されたパターンに一致するファイルやディレクトリのパスを検索し、その結果を配列として返す際、検索対象を「ディレクトリのみ」に限定する役割を果たします。通常、glob()関数はファイルとディレクトリの両方を検索しますが、GLOB_ONLYDIRをフラグとして渡すことで、結果からファイルを除外し、ディレクトリの情報だけを効率的に取得できます。
提供されたサンプルコードでは、listSubdirectoriesWithGlobOnlyDir()関数内でglob('*', GLOB_ONLYDIR)という形で利用されています。これは、「現在のディレクトリにあるすべてのエントリの中から、ファイルを除外し、サブディレクトリのみを検索して一覧表示する」という意味になります。このスクリプトを実行すると、現在のディレクトリに存在するサブディレクトリ(例えば、test_dirやdataといったフォルダ)が検出され、その名前が表示されます。サブディレクトリが見つからない場合や検索に失敗した場合には、それぞれに応じたメッセージが出力されます。このようにGLOB_ONLYDIRを用いることで、システム開発において特定の種類のディレクトリだけを対象とした処理を安全かつ簡潔に実装することが可能です。
PHPのglob()関数は、指定したパターンに一致するファイルやディレクトリを検索する強力な機能ですが、GLOB_ONLYDIR定数を組み合わせると、結果をサブディレクトリのみに限定できます。この機能を使う際は、検索パターンにワイルドカード(*など)が含まれるため、対象とするディレクトリのパスを明確にし、PHPスクリプトが実行されるユーザーに適切な読み取り権限があるかを確認することが重要です。特に、ユーザーからの入力をパターンに直接使用すると、意図しない情報漏洩や操作につながる可能性があるため、必ずサニタイズやバリデーションを行ってください。また、glob()関数は検索に失敗した場合にfalseを返すため、常に戻り値をチェックし、エラーハンドリングを適切に実装することが安全なコード運用の基本です。GLOB_ONLYDIRは内部的には整数値ですが、glob()関数の動作を制御する「フラグ」として理解すると良いでしょう。
PHPでディレクトリのみを検索する
1<?php 2 3/** 4 * カレントディレクトリ直下のディレクトリのみを検索し、表示します。 5 * GLOB_ONLYDIR定数を使用して、glob()関数の検索結果をディレクトリに限定します。 6 */ 7function listOnlyDirectories(): void 8{ 9 // glob()関数でカレントディレクトリ('.')直下のすべての要素('*')を検索し、 10 // GLOB_ONLYDIRフラグを指定することで、結果をディレクトリのみに限定します。 11 $directories = glob('./*', GLOB_ONLYDIR); 12 13 if ($directories === false) { 14 echo "エラー: ディレクトリの検索に失敗しました。\n"; 15 return; 16 } 17 18 if (empty($directories)) { 19 echo "カレントディレクトリにサブディレクトリは見つかりませんでした。\n"; 20 } else { 21 echo "見つかったサブディレクトリ:\n"; 22 foreach ($directories as $dir) { 23 // パスの先頭にある "./" を取り除いて表示します。 24 echo "- " . ltrim($dir, './') . "\n"; 25 } 26 } 27} 28 29// 上記で定義した関数を実行します。 30listOnlyDirectories(); 31 32?>
PHPのGLOB_ONLYDIRは、ファイルシステムを検索する際に特定の条件を指定するための定数です。この定数自体には引数はなく、内部的には特定のフラグとして機能する整数値(int)が割り当てられています。
通常、PHPのglob()関数は、指定されたパターンに一致するファイルやディレクトリのパスを両方とも検索して配列として返します。しかし、GLOB_ONLYDIR定数をglob()関数の第二引数に指定することで、その検索動作を変更し、結果として取得されるパスをディレクトリのみに限定することができます。
サンプルコードでは、listOnlyDirectories関数内でglob('./*', GLOB_ONLYDIR)を実行しています。これは「現在のディレクトリ(.)直下にあるすべての要素(*)を検索するが、結果はディレクトリだけに絞り込む」という意味になります。glob()関数が成功し、ディレクトリが見つかった場合は、それらのパスを一覧表示します。パスの先頭にある./を取り除くためにltrim()関数を使用し、より簡潔な形で出力しています。この定数を使用することで、ファイルを除外してディレクトリ情報だけが必要な場合に、コードを簡潔かつ効率的に記述することが可能です。
glob()関数は検索に失敗するとfalseを返すため、必ずエラーチェックを行ってください。GLOB_ONLYDIR定数を使用することで、検索結果をディレクトリに限定できますが、これを指定しないとファイルも含まれる点に注意が必要です。このサンプルコードはカレントディレクトリ直下のディレクトリのみを検索し、サブディレクトリ内のさらに深い階層は対象外です。より広範囲を検索したい場合は、RecursiveDirectoryIteratorなどの利用を検討してください。./*という検索パターンはカレントディレクトリの直下を意味します。また、大量のファイルやディレクトリがある環境では、glob()関数の実行がシステムに負荷をかける可能性もあるため、パフォーマンスにも留意して利用してください。