【PHP8.x】FilesystemIterator::__construct()メソッドの使い方
__constructメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
__constructメソッドは、FilesystemIteratorオブジェクトを初期化する際に自動的に実行される特別なメソッドです。このメソッドは、ファイルシステム内の特定のディレクトリを効率的に巡回し、その内容にアクセスするための準備を行います。
具体的には、FilesystemIteratorオブジェクトを作成する際に、巡回したいディレクトリのパスを文字列として第一引数に指定します。これにより、イテレータがどのディレクトリ内のファイルやサブディレクトリを処理するかの起点が決まります。
第二引数にはオプションのフラグを指定でき、これによってイテレータの動作を細かく制御できます。例えば、FilesystemIterator::KEY_AS_PATHNAMEフラグは、イテレータのキーとしてファイルやディレクトリのフルパスを使用するように設定します。また、FilesystemIterator::CURRENT_AS_FILEINFOフラグを指定すると、現在の要素をSplFileInfoオブジェクトとして取得できるようになり、ファイル名やサイズ、更新日時などの詳細な情報に簡単にアクセスできます。さらに、FilesystemIterator::SKIP_DOTSフラグは、"."(現在のディレクトリ)と".."(親ディレクトリ)といった特殊なエントリを巡回対象から除外するために利用されます。これらのフラグは複数組み合わせて指定することも可能で、デフォルトではこれら3つのフラグが有効になっています。
この__constructメソッドを通じて、指定されたディレクトリの内容を柔軟かつ効率的に操作するためのFilesystemIteratorオブジェクトが適切に設定されます。
構文(syntax)
1public FilesystemIterator::__construct(string $directory, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS);
引数(parameters)
string $directory, int $flags = 0
- string $directory: スキャンするディレクトリのパスを指定する文字列
- int $flags = 0: FilesystemIterator の動作を制御するフラグを指定する整数
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP: FilesystemIterator コンストラクタでディレクトリを走査する
1<?php 2 3// FilesystemIterator のコンストラクタの使用方法を示すサンプルコードです。 4// このクラスは、指定されたディレクトリの内容を反復処理するためのイテレータを提供します。 5 6// 1. テスト用のディレクトリとファイルを作成 7// このスクリプトが実行される一時的なディレクトリを作成します。 8$testDir = __DIR__ . DIRECTORY_SEPARATOR . 'fs_iterator_example_dir'; 9 10// ディレクトリが存在しない場合のみ作成します。 11if (!is_dir($testDir)) { 12 mkdir($testDir); 13 echo "テストディレクトリを作成しました: " . $testDir . "\n"; 14} 15 16// テスト用のダミーファイルを作成します。 17$file1 = $testDir . DIRECTORY_SEPARATOR . 'document.txt'; 18$file2 = $testDir . DIRECTORY_SEPARATOR . 'image.jpg'; 19$subDir = $testDir . DIRECTORY_SEPARATOR . 'nested_directory'; 20 21file_put_contents($file1, 'This is a test document.'); 22file_put_contents($file2, 'This is a dummy image file.'); 23if (!is_dir($subDir)) { 24 mkdir($subDir); 25} 26file_put_contents($subDir . DIRECTORY_SEPARATOR . 'readme.md', 'Content for nested directory.'); 27 28echo "\n--- FilesystemIterator::__construct の使用例 ---\n\n"; 29 30// 例1: ディレクトリパスのみを指定して FilesystemIterator をインスタンス化 31// これはコンストラクタの第2引数 ($flags) を省略し、デフォルト値 (0) を使用する例です。 32// デフォルトでは、カレントディレクトリを表す '.' と、親ディレクトリを表す '..' も含まれることがあります。 33echo "1. ディレクトリパスのみでインスタンス化 (デフォルトフラグ):\n"; 34try { 35 // FilesystemIterator のコンストラクタを呼び出し、引数として対象ディレクトリのパスを渡します。 36 $iteratorDefault = new FilesystemIterator($testDir); 37 38 echo " [デフォルトフラグでの要素一覧]:\n"; 39 foreach ($iteratorDefault as $fileInfo) { 40 // SplFileInfo オブジェクトからファイル名を取得します。 41 echo " - " . $fileInfo->getFilename() . "\n"; 42 } 43} catch (UnexpectedValueException $e) { 44 // 指定されたディレクトリが存在しない、または読み込み権限がない場合に発生します。 45 echo "エラー: ディレクトリ '" . $testDir . "' の読み込みに失敗しました。\n"; 46 echo "詳細: " . $e->getMessage() . "\n"; 47} 48 49echo "\n"; 50 51// 例2: ディレクトリパスとフラグを指定して FilesystemIterator をインスタンス化 52// FilesystemIterator::SKIP_DOTS フラグを使用すると、'.' と '..' をスキップできます。 53echo "2. ディレクトリパスとフラグ (SKIP_DOTS) でインスタンス化:\n"; 54try { 55 // FilesystemIterator のコンストラクタを呼び出し、第2引数でフラグを指定します。 56 // 複数のフラグは '|' (ビットOR演算子) で結合できます。 57 $iteratorWithFlags = new FilesystemIterator($testDir, FilesystemIterator::SKIP_DOTS); 58 59 echo " [SKIP_DOTS フラグでの要素一覧]:\n"; 60 foreach ($iteratorWithFlags as $fileInfo) { 61 echo " - " . $fileInfo->getFilename() . "\n"; 62 } 63} catch (UnexpectedValueException $e) { 64 echo "エラー: ディレクトリ '" . $testDir . "' の読み込みに失敗しました。\n"; 65 echo "詳細: " . $e->getMessage() . "\n"; 66} 67 68echo "\n--- クリーンアップ ---\n"; 69 70// 2. 作成したファイルとディレクトリを削除してクリーンアップ 71// rmdir() は空のディレクトリしか削除できないため、まずファイルとサブディレクトリを削除します。 72if (is_file($file1)) { 73 unlink($file1); 74} 75if (is_file($file2)) { 76 unlink($file2); 77} 78if (is_file($subDir . DIRECTORY_SEPARATOR . 'readme.md')) { 79 unlink($subDir . DIRECTORY_SEPARATOR . 'readme.md'); 80} 81if (is_dir($subDir)) { 82 rmdir($subDir); 83} 84if (is_dir($testDir)) { 85 rmdir($testDir); 86} 87 88echo "テスト用ディレクトリとファイルを削除しました。\n"; 89 90?>
PHPのFilesystemIteratorクラスは、指定されたディレクトリ内のファイルやサブディレクトリを反復処理するための機能を提供します。そのコンストラクタである__constructは、新しいFilesystemIteratorオブジェクトを作成する際に使用されます。
このコンストラクタは、必須引数として$directoryに調査したいディレクトリのパスを文字列で受け取ります。オプション引数である$flagsには、反復処理の挙動を制御するための整数値を指定できます。デフォルト値は0で、特定のフラグを指定しない場合の挙動となります。コンストラクタは戻り値を直接返しませんが、実行が成功すると設定されたFilesystemIteratorオブジェクトが生成され、変数に格納されます。
サンプルコードではまず、FilesystemIteratorの動作確認のための一時的なディレクトリとファイルを作成しています。最初の使用例では、ディレクトリパスのみを引数に渡し、デフォルトのフラグでインスタンス化しています。これにより、ディレクトリ内の要素が一覧表示されますが、通常はカレントディレクトリを示す「.」や親ディレクトリを示す「..」も含まれることがあります。
二番目の例では、コンストラクタの第二引数にFilesystemIterator::SKIP_DOTSというフラグを指定しています。このフラグを設定することで、「.」や「..」がスキップされ、純粋なファイルやサブディレクトリの名前のみが取得されるようになります。foreachループを使って、イテレータが提供する各要素(SplFileInfoオブジェクト)からファイル名を取得し表示しています。最後に、作成したテスト用のディレクトリとファイルをすべて削除し、環境をクリーンアップしています。
FilesystemIterator::__constructを利用する際は、第一引数に指定するディレクトリパスが正しいことを確認してください。もし存在しないパスやアクセス権がないパスを指定するとUnexpectedValueExceptionが発生するため、try-catchブロックで適切にエラーを処理することが重要です。また、第二引数の$flagsを省略すると、.(カレントディレクトリ)や..(親ディレクトリ)も反復処理の対象に含まれることがあります。これらを除外したい場合は、FilesystemIterator::SKIP_DOTSフラグを明示的に指定してください。複数のフラグを組み合わせる場合は、|(ビットOR演算子)で結合して使用します。
FilesystemIterator::__constructでディレクトリを走査する
1<?php 2 3/** 4 * FilesystemIterator::__construct メソッドのサンプルコード 5 * 6 * このスクリプトは、FilesystemIterator のコンストラクタが 7 * どのようにディレクトリパスとオプションのフラグを受け取り、 8 * ディレクトリの内容を走査するためのイテレータを作成するかを示します。 9 * システムエンジニアを目指す初心者の方にも分かりやすいよう、 10 * 基本的な使い方と、フラグを使ったカスタマイズの例を提示します。 11 */ 12 13// 1. テスト用の一時ディレクトリを作成し、サンプルファイルを配置します。 14// これにより、どこでスクリプトを実行しても確実に動作するようになります。 15$tempDir = __DIR__ . '/fs_iterator_test_' . uniqid(); 16if (!mkdir($tempDir) && !is_dir($tempDir)) { 17 echo "エラー: ディレクトリ '{$tempDir}' を作成できませんでした。\n"; 18 exit(1); 19} 20file_put_contents($tempDir . '/document.txt', 'This is a test document.'); 21file_put_contents($tempDir . '/image.jpg', 'fake image data'); 22mkdir($tempDir . '/subfolder'); // テスト用に空のサブディレクトリも作成 23 24echo "--- FilesystemIterator::__construct のサンプル ---\n\n"; 25 26// --- サンプル 1: ディレクトリパスのみを指定する基本的な使い方 --- 27echo "■ 1. ディレクトリパスのみを指定する場合 (デフォルトの挙動):\n"; 28echo " (通常は '.' と '..' エントリ、およびディレクトリ自身を含みます)\n"; 29try { 30 // FilesystemIterator のコンストラクタを呼び出します。 31 // 第1引数: 走査したいディレクトリのパス (string, 必須) 32 // 第2引数: 省略された場合、デフォルトのフラグ (0) が使用されます。 33 $iteratorDefault = new FilesystemIterator($tempDir); 34 35 echo " ディレクトリ '{$tempDir}' の内容:\n"; 36 foreach ($iteratorDefault as $fileinfo) { 37 echo " - " . $fileinfo->getFilename(); 38 if ($fileinfo->isDir()) { 39 echo " (ディレクトリ)"; 40 } elseif ($fileinfo->isFile()) { 41 echo " (ファイル)"; 42 } 43 echo "\n"; 44 } 45} catch (UnexpectedValueException $e) { 46 // 指定されたパスが存在しない、またはディレクトリでない場合に発生します。 47 echo " エラー: " . $e->getMessage() . "\n"; 48} 49 50echo "\n------------------------------------------------\n\n"; 51 52// --- サンプル 2: フラグを指定して挙動をカスタマイズする使い方 --- 53echo "■ 2. フラグ (FilesystemIterator::SKIP_DOTS | FilesystemIterator::KEY_AS_FILENAME) を指定する場合:\n"; 54echo " ( '.' と '..' をスキップし、イテレータのキーをファイル名にします)\n"; 55try { 56 // FilesystemIterator のコンストラクタを呼び出します。 57 // 第1引数: 走査したいディレクトリのパス 58 // 第2引数: 挙動をカスタマイズするためのフラグ (int)。 59 // 複数のフラグは '|' (ビットOR演算子) で結合します。 60 // - FilesystemIterator::SKIP_DOTS: '.' と '..' をスキップします。 61 // - FilesystemIterator::KEY_AS_FILENAME: イテレータのキーをファイル名にします。 62 $flags = FilesystemIterator::SKIP_DOTS | FilesystemIterator::KEY_AS_FILENAME; 63 $iteratorWithFlags = new FilesystemIterator($tempDir, $flags); 64 65 echo " ディレクトリ '{$tempDir}' の内容 (フラグ適用後):\n"; 66 foreach ($iteratorWithFlags as $key => $fileinfo) { 67 // ここで `$key` がファイル名になっていることを確認できます。 68 echo " - キー: '{$key}', ファイル名: " . $fileinfo->getFilename(); 69 if ($fileinfo->isDir()) { 70 echo " (ディレクトリ)"; 71 } elseif ($fileinfo->isFile()) { 72 echo " (ファイル)"; 73 } 74 echo "\n"; 75 } 76} catch (UnexpectedValueException $e) { 77 // 指定されたパスが存在しない、またはディレクトリでない場合に発生します。 78 echo " エラー: " . $e->getMessage() . "\n"; 79} 80 81// 3. 後処理: 作成した一時ディレクトリとファイルを削除します。 82echo "\n------------------------------------------------\n"; 83echo "一時ディレクトリとファイルの削除中...\n"; 84if (is_dir($tempDir)) { 85 // 作成したファイルと空のサブディレクトリを削除します。 86 // FilesystemIterator::SKIP_DOTS を使用して '.' と '..' を避けます。 87 foreach (new FilesystemIterator($tempDir, FilesystemIterator::SKIP_DOTS) as $item) { 88 if ($item->isDir()) { 89 // サブディレクトリの場合 90 rmdir($item->getPathname()); 91 } else { 92 // ファイルの場合 93 unlink($item->getPathname()); 94 } 95 } 96 // 空になった親ディレクトリを削除します。 97 rmdir($tempDir); 98 echo "一時ディレクトリ '{$tempDir}' を削除しました。\n"; 99} 100 101?>
FilesystemIterator::__constructは、PHPで指定されたディレクトリの内容を順番に処理するための「イテレータ」と呼ばれるオブジェクトを生成するコンストラクタです。
このメソッドは、第1引数 $directory に走査したいディレクトリのパスを文字列で受け取ります。この引数は必須であり、正しいディレクトリパスを指定する必要があります。第2引数 $flags はオプションの引数で、イテレータの動作を細かく制御するための整数値を設定します。このフラグを省略した場合、デフォルトの挙動(フラグ値0)が適用されます。
$flags を使用することで、例えば FilesystemIterator::SKIP_DOTS フラグを指定して . や .. といった特殊なディレクトリのエントリを無視したり、FilesystemIterator::KEY_AS_FILENAME フラグでイテレータのキーをファイル名に変更したりするなど、様々なカスタマイズが可能です。
このメソッドはコンストラクタであるため、新しい FilesystemIterator オブジェクトを初期化して返すだけで、特定の戻り値はありません。サンプルコードでは、ディレクトリパスのみを指定する基本的な使用方法と、複数のフラグを組み合わせてイテレータの挙動をカスタマイズする応用的な使用方法の両方を示しており、ディレクトリ内のファイルやフォルダを効率的に操作する際の基礎となります。
FilesystemIteratorのコンストラクタは、必ず存在するディレクトリのパスを第一引数に指定してください。指定されたパスが存在しない、またはディレクトリでない場合はUnexpectedValueExceptionが発生するため、try-catchブロックでの適切なエラーハンドリングが重要です。第二引数のフラグはオプションですが、FilesystemIterator::SKIP_DOTSのように特定のファイル(. や ..)をスキップするなど、イテレータの挙動を細かく制御できます。複数のフラグは|(ビットOR演算子)で組み合わせて使用可能です。フラグを指定しない場合、デフォルトでは「.」と「..」も走査対象に含まれることに留意してください。コンストラクタ自体は戻り値がありませんが、newキーワードでFilesystemIteratorのインスタンスが生成されます。