【PHP8.x】GLOB_MARK定数の使い方
GLOB_MARK定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
GLOB_MARK定数は、PHPのglob()関数と組み合わせて使用する際に、特定の動作を制御するためのフラグを表す定数です。glob()関数は、ファイルシステム上で指定されたパターンに一致するファイルやディレクトリのパスを見つけ出すための機能を提供します。この定数をglob()関数に渡すことで、検索結果として見つかったディレクトリのパス名に対し、特別な処理を施すことができます。
具体的には、GLOB_MARK定数を指定した場合、glob()関数がファイルシステムからディレクトリを検出すると、そのディレクトリのパス名の末尾に自動的にスラッシュ(/)を追加して返します。例えば、glob('./*', GLOB_MARK) のように使用すると、結果の配列には['./file.txt', './directory_name/']のように、ディレクトリ名にはスラッシュが付加された形式で格納されます。
この機能は、取得したパスのリストの中から、どの要素がファイルで、どの要素がディレクトリであるかを明確に識別したい場合に非常に有用です。プログラマーは、スラッシュの有無を調べるだけで、各項目がファイルかディレクトリかを簡単に判別できるようになります。これにより、例えばディレクトリ内をさらに探索するといった、ファイルとディレクトリで異なる処理を適用するロジックを、より簡潔かつ安全に記述することが可能になります。GLOB_MARKは、ファイルシステムを扱うアプリケーションにおいて、結果の可読性を高め、処理の効率性を向上させるための実用的なツールとして利用されます。
構文(syntax)
1<?php 2$filesAndDirs = glob('*', GLOB_MARK); 3?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
GLOB_MARK は、glob() 関数で使用される定数です。この定数を指定すると、返されるファイル名には、それがディレクトリであれば末尾にスラッシュ(/)が自動的に付加されます。この定数の戻り値は整数型です。
サンプルコード
PHP glob()関数でファイル検索する
1<?php 2 3/** 4 * glob() 関数とそのフラグ (GLOB_MARK, GLOB_BRACE) の使用例を示します。 5 * 6 * この関数は、指定されたパターンに一致するファイルやディレクトリを検索します。 7 * GLOB_MARK は、返されるディレクトリ名にスラッシュを追加します。 8 * GLOB_BRACE は、`{pattern1,pattern2}` のような波括弧パターンを展開します。 9 */ 10function demonstrateGlobFlags(): void 11{ 12 // 一時ディレクトリを作成し、テスト用のファイルとディレクトリを準備します。 13 $tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'php_glob_test_' . uniqid(); 14 if (!mkdir($tempDir, 0777, true)) { 15 echo "一時ディレクトリの作成に失敗しました: {$tempDir}\n"; 16 return; 17 } 18 19 // テスト用のファイルとディレクトリを作成します。 20 file_put_contents($tempDir . DIRECTORY_SEPARATOR . 'document.txt', 'これはテキストファイルです。'); 21 file_put_contents($tempDir . DIRECTORY_SEPARATOR . 'script.php', '<?php echo "Hello PHP!";'); 22 mkdir($tempDir . DIRECTORY_SEPARATOR . 'images'); 23 file_put_contents($tempDir . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'photo.jpg', '画像データ'); 24 mkdir($tempDir . DIRECTORY_SEPARATOR . 'data'); 25 file_put_contents($tempDir . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'log.log', 'ログエントリ'); 26 27 echo "一時ディレクトリ: {$tempDir}\n"; 28 echo "--- glob() 関数の使用例 ---\n\n"; 29 30 // --- GLOB_MARK の使用例 --- 31 echo "1. GLOB_MARKなし (ディレクトリ名にスラッシュなし):\n"; 32 // すべてのファイルとディレクトリを検索するパターン 33 $patternWithoutMark = $tempDir . DIRECTORY_SEPARATOR . '*'; 34 $resultsWithoutMark = glob($patternWithoutMark); 35 echo " パターン: '{$patternWithoutMark}'\n"; 36 echo " 結果:\n"; 37 foreach ($resultsWithoutMark as $item) { 38 echo " - " . basename($item) . "\n"; 39 } 40 echo "\n"; 41 42 echo "2. GLOB_MARKあり (ディレクトリ名にスラッシュあり):\n"; 43 // すべてのファイルとディレクトリを検索し、ディレクトリ名にスラッシュを追加 44 $patternWithMark = $tempDir . DIRECTORY_SEPARATOR . '*'; 45 $resultsWithMark = glob($patternWithMark, GLOB_MARK); 46 echo " パターン: '{$patternWithMark}'\n"; 47 echo " 結果:\n"; 48 foreach ($resultsWithMark as $item) { 49 echo " - " . basename($item) . "\n"; 50 } 51 echo " (「images/」や「data/」のようにディレクトリ名にスラッシュが付いていることに注目)\n\n"; 52 53 // --- GLOB_BRACE の使用例 --- 54 echo "3. GLOB_BRACEあり (波括弧パターン展開):\n"; 55 // 拡張子が '.txt' または '.php' のファイルを探すパターン 56 $patternWithBrace = $tempDir . DIRECTORY_SEPARATOR . '*.{txt,php}'; 57 $resultsWithBrace = glob($patternWithBrace, GLOB_BRACE); 58 echo " パターン: '{$patternWithBrace}'\n"; 59 echo " 結果:\n"; 60 if (empty($resultsWithBrace)) { 61 echo " - 一致するファイルはありませんでした。\n"; 62 } else { 63 foreach ($resultsWithBrace as $item) { 64 echo " - " . basename($item) . "\n"; 65 } 66 } 67 echo " (拡張子が '.txt' または '.php' のファイルのみが取得されていることに注目)\n\n"; 68 69 // --- GLOB_MARK と GLOB_BRACE の組み合わせ --- 70 echo "4. GLOB_MARK と GLOB_BRACE の組み合わせ:\n"; 71 // 特定のファイルとディレクトリを波括弧で指定し、ディレクトリにスラッシュを追加 72 $patternCombined = $tempDir . DIRECTORY_SEPARATOR . '{document.txt,script.php,images,data}'; 73 // GLOB_MARK と GLOB_BRACE をビット OR 演算子 `|` で結合して両方のフラグを渡します。 74 $resultsCombined = glob($patternCombined, GLOB_MARK | GLOB_BRACE); 75 echo " パターン: '{$patternCombined}'\n"; 76 echo " 結果:\n"; 77 if (empty($resultsCombined)) { 78 echo " - 一致するファイルはありませんでした。\n"; 79 } else { 80 foreach ($resultsCombined as $item) { 81 echo " - " . basename($item) . "\n"; 82 } 83 } 84 echo " (波括弧パターンが展開され、「images/」や「data/」のようにディレクトリにスラッシュが付いていることに注目)\n\n"; 85 86 // 後処理: 作成した一時ファイルとディレクトリを削除します。 87 // rmdir() は空のディレクトリしか削除できないため、再帰的に削除するヘルパー関数を使用します。 88 deleteDirectory($tempDir); 89 echo "一時ディレクトリ '{$tempDir}' とその内容を削除しました。\n"; 90} 91 92/** 93 * ディレクトリとその内容を再帰的に削除するヘルパー関数。 94 * 95 * @param string $dirPath 削除するディレクトリのパス。 96 * @return bool 成功した場合は true、失敗した場合は false。 97 */ 98function deleteDirectory(string $dirPath): bool 99{ 100 if (!is_dir($dirPath)) { 101 return false; 102 } 103 // ディレクトリ内のすべてのファイルとサブディレクトリを取得 (隠しファイルも含む) 104 $files = glob($dirPath . DIRECTORY_SEPARATOR . '{*,.*}', GLOB_BRACE); 105 foreach ($files as $file) { 106 // カレントディレクトリ '.' と親ディレクトリ '..' への参照はスキップ 107 if (basename($file) === '.' || basename($file) === '..') { 108 continue; 109 } 110 if (is_dir($file)) { 111 // サブディレクトリであれば再帰的に削除 112 deleteDirectory($file); 113 } else { 114 // ファイルであれば削除 115 unlink($file); 116 } 117 } 118 // ディレクトリ自体を削除 119 return rmdir($dirPath); 120} 121 122// 関数を実行します。 123demonstrateGlobFlags(); 124 125?>
PHPのglob()関数は、指定されたパターンに一致するファイルやディレクトリを検索し、そのパスのリストを配列として返します。この関数は、ファイルシステムから特定の条件を満たす要素を見つけ出す際に非常に便利です。
GLOB_MARKは整数型(int)の定数で、glob()関数のオプション引数として渡すことで、検索結果のディレクトリ名の末尾にスラッシュ(/)が追加されます。これにより、リスト内でファイルとディレクトリを視覚的に区別しやすくなります。サンプルコードでは、GLOB_MARKを適用することで「images/」や「data/」のようにディレクトリ名にスラッシュが付く様子を確認できます。
一方、GLOB_BRACEもglob()関数で使用される整数型の定数で、{pattern1,pattern2}のように波括弧で囲まれたパターンを指定した場合、それらを個別のパターンとして展開し、一致するファイルを検索します。例えば、*.{txt,php}と指定すると、.txtまたは.phpの拡張子を持つファイルを一度に検索対象とすることができます。サンプルコードでは、この機能を使って複数の拡張子を持つファイルを効率的に取得しています。
これらのフラグは、ビットOR演算子|を使ってGLOB_MARK | GLOB_BRACEのように複数組み合わせることができ、両方の効果を同時に適用することが可能です。glob()関数とこれらの便利な定数を活用することで、PHPでファイルシステムを柔軟かつ効率的に操作できます。
glob()関数は、ファイルやディレクトリのパスをパターンに基づいて検索する便利な機能です。GLOB_MARKフラグはディレクトリ名にスラッシュを追加し、GLOB_BRACEフラグは{pattern1,pattern2}のような波括弧パターンを展開します。複数のフラグを組み合わせる場合は、|(ビットOR演算子)を使用して渡すことを覚えておきましょう。ファイルシステムを操作する機能のため、不正なパターン入力による意図しないファイルへのアクセスや、誤って重要なファイルを削除しないよう、常に適切なパスと権限を確認し、特にユーザーからの入力値を直接パターンとして使用しないよう注意が必要です。また、glob()は一致するパスがない場合に空の配列を返しますので、その後の処理で結果が空でないか確認する習慣をつけましょう。サンプルコードのように一時ファイルやディレクトリを作成した場合は、必ず実行後に適切にクリーンアップする処理を実装してください。
PHP GLOB_MARKでディレクトリを抽出する
1<?php 2 3/** 4 * GLOB_MARK定数の動作と、glob関数でディレクトリのみを抽出する応用例を示します。 5 * 6 * GLOB_MARKは、glob関数でマッチしたディレクトリ名に末尾のスラッシュ (/) を追加する整数定数です。 7 * この定数自体がディレクトリのみを抽出するわけではありませんが、追加されたスラッシュを利用して 8 * 結果からディレクトリを識別し、フィルタリングする応用が可能です。 9 * 10 * このサンプルコードは、キーワード「php glob_onlydir」の意図である「ディレクトリのみをリストアップする」 11 * 方法をGLOB_MARKと組み合わせて実現する例を示します。 12 */ 13function demonstrateGlobMarkAndFilterDirectories(): void 14{ 15 // 現在のディレクトリにテスト用のファイルとディレクトリを作成します。 16 // これにより、サンプルコードが単体で動作し、結果がわかりやすくなります。 17 $testDir = 'test_glob_target_dir'; 18 if (!is_dir($testDir)) { 19 mkdir($testDir); 20 } 21 file_put_contents('example_file.txt', 'This is a test file.'); 22 file_put_contents('another_file.log', 'This is another test file.'); 23 if (!is_dir($testDir . '/sub_directory')) { 24 mkdir($testDir . '/sub_directory'); 25 } 26 file_put_contents($testDir . '/sub_directory/nested_file.txt', 'This is a nested file.'); 27 28 echo "--- 1. glob() で現在のディレクトリの全てを検索 (GLOB_MARKなし) ---\n"; 29 echo " (ディレクトリとファイルの両方が含まれます。ディレクトリにはスラッシュが付きません)\n"; 30 $allMatches = glob('*'); 31 foreach ($allMatches as $item) { 32 echo " - " . $item . "\n"; 33 } 34 echo "\n"; 35 36 echo "--- 2. glob() で全てを検索 (GLOB_MARK定数を使用) ---\n"; 37 echo " (GLOB_MARKを使用すると、マッチしたディレクトリ名の最後にスラッシュが追加されます)\n"; 38 $markedMatches = glob('*', GLOB_MARK); 39 foreach ($markedMatches as $item) { 40 echo " - " . $item . "\n"; 41 } 42 echo "\n"; 43 44 echo "--- 3. GLOB_MARK の結果を利用してディレクトリのみを抽出 ---\n"; 45 echo " (GLOB_MARKによって追加されたスラッシュ、またはis_dir()関数を利用して、\n"; 46 echo " 結果からディレクトリのみをフィルタリングします。これが「glob_onlydir」の応用例です)\n"; 47 $onlyDirectories = array_filter($markedMatches, function ($item) { 48 // is_dir() 関数で、実際にパスがディレクトリであるか判定します。 49 // GLOB_MARKによって末尾にスラッシュが付与されたパスも正しく判定されます。 50 return is_dir($item); 51 // または、GLOB_MARKの動作を直接利用して末尾のスラッシュの有無で判定することも可能です。 52 // return str_ends_with($item, DIRECTORY_SEPARATOR); 53 }); 54 55 if (empty($onlyDirectories)) { 56 echo " ディレクトリは見つかりませんでした。\n"; 57 } else { 58 foreach ($onlyDirectories as $dir) { 59 echo " - " . $dir . "\n"; 60 } 61 } 62 echo "\n"; 63 64 // テスト用に作成したファイルとディレクトリをクリーンアップします。 65 unlink('example_file.txt'); 66 unlink('another_file.log'); 67 unlink($testDir . '/sub_directory/nested_file.txt'); 68 rmdir($testDir . '/sub_directory'); 69 rmdir($testDir); 70 echo "テスト用ファイルとディレクトリを削除しました。\n"; 71} 72 73// 関数を実行し、GLOB_MARKの動作と応用例を確認します。 74demonstrateGlobMarkAndFilterDirectories();
PHP 8のGLOB_MARKは、PHPの拡張機能の一部である整数型の定数です。この定数は引数を取らず、glob()関数と組み合わせて使用されます。glob()関数は、指定されたパターンにマッチするファイルやディレクトリのパスを配列として返しますが、オプションとしてGLOB_MARKを指定すると、マッチした項目がディレクトリであった場合に、そのパスの末尾にスラッシュ(/)が追加されるという特別な挙動を示します。
サンプルコードは、まずGLOB_MARKを使用しない場合のglob('*')の結果を示し、ファイルとディレクトリがそのままリストされることを確認します。次にGLOB_MARKを指定してglob('*', GLOB_MARK)を実行すると、ディレクトリ名にのみスラッシュが付与される様子が確認できます。このGLOB_MARKによって付与されたスラッシュ、またはis_dir()関数を併用することで、「ディレクトリのみをリストアップしたい(php glob_onlydir)」というニーズに応用できます。具体的には、GLOB_MARKで結果を取得した後、末尾のスラッシュの有無やis_dir()関数を用いてフィルタリングすることで、正確にディレクトリのみを抽出することが可能です。このコードは、一時的なファイルとディレクトリを作成して検索・フィルタリングの過程を段階的に示し、GLOB_MARKの動作と応用例を分かりやすく解説しています。
GLOB_MARKは、マッチしたディレクトリ名に末尾のスラッシュを追加する定数であり、それ自体がディレクトリのみを抽出する機能ではないことにご注意ください。サンプルコードのように、is_dir()関数と組み合わせてフィルタリングすることで、ディレクトリを確実に特定し抽出できます。末尾のスラッシュを利用した判定は簡潔ですが、is_dir()の方がより堅牢な方法です。glob関数は、実行される環境のファイルシステムに依存するため、意図しないファイルやディレクトリが検出されないよう、パス指定には細心の注意を払ってください。また、サンプルコード内のテスト用ファイルやディレクトリの作成・削除処理は、あくまで動作確認のためのものですので、実際のアプリケーションでは取り除いてください。大量のファイルを処理する際には、パフォーマンスへの影響も考慮する必要があります。