【PHP8.x】GlobIterator::__construct()メソッドの使い方
__constructメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
GlobIteratorクラスの__constructメソッドは、新しいGlobIteratorオブジェクトを初期化し、指定されたファイルパターンに一致するファイルシステムのエントリを反復処理できるようにするための準備を実行するメソッドです。
GlobIteratorは、ファイルシステムから特定の条件に合致するファイルやディレクトリのパスを簡単に取得し、それらを順に処理(イテレート)する際に利用される便利なクラスです。このメソッドの第一引数 $pattern には、検索したいファイルやディレクトリのパスを「グロブパターン」と呼ばれる形式で指定します。グロブパターンは、シェルでファイル名を指定する際に使用するワイルドカード(例えば * は任意の文字列、? は任意の一文字)を含むことができ、これにより「あるディレクトリ内の全てのPHPファイル (/path/to/files/*.php)」や「特定の文字で始まるファイル (/path/to/files/report_???.txt)」のように柔軟な条件でファイルを指定できます。
第二引数 $flags はオプションであり、検索の挙動を細かく制御するためのGLOB_*定数を一つ以上、ビットOR演算子 (|) で組み合わせて指定できます。例えば、GLOB_MARKフラグを指定すると、検索結果のディレクトリ名にスラッシュを追加して表示したり、GLOB_NOSORTフラグで検索結果のソートを行わないように設定したりすることが可能です。
このコンストラクタを実行することで、指定されたパターンに合致するファイルやディレクトリのリストが内部的に準備され、生成されたGlobIteratorオブジェクトを使って、それらのエントリを一つずつ効率的に取得・操作できるようになります。これにより、システムエンジニアは複雑なファイル検索ロジックを自身で実装することなく、ファイルシステム上の多数のファイルを対象とした処理を簡潔に記述できます。
構文(syntax)
1new GlobIterator('*.php');
引数(parameters)
string $pattern, int $flags = FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS
- string $pattern: 検索するファイルパスのパターンを指定します。ワイルドカード(例:
*,?,[])を使用できます。 - int $flags = FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS: 検索時の挙動を制御するフラグを指定します。デフォルトでは、カレントディレクトリを示す
.と親ディレクトリを示す..をスキップし、ファイル情報をSplFileInfoオブジェクトとして取得します。
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP8コンストラクタプロモーションでGlobIteratorを拡張する
1<?php 2 3/** 4 * GlobIterator を継承し、PHP 8 のコンストラクタプロモーションを利用して 5 * 検索パターンとフラグをプロパティとして保持するカスタムイテレータ。 6 */ 7class MyPatternFileFinder extends GlobIterator 8{ 9 /** 10 * コンストラクタプロモーションを使用して、`$pattern` と `$flags` を 11 * プライベートプロパティとして宣言し、同時に初期化します。 12 * その後、これらの値は親クラス (GlobIterator) のコンストラクタに渡されます。 13 * 14 * @param string $pattern 検索するファイルパスのパターン (例: /path/to/*.txt) 15 * @param int $flags FilesystemIterator のフラグの組み合わせ (例: FilesystemIterator::SKIP_DOTS) 16 */ 17 public function __construct( 18 private string $pattern, 19 private int $flags = FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS 20 ) { 21 // 親クラスである GlobIterator のコンストラクタを呼び出し、 22 // 指定されたパターンとフラグでイテレータを初期化します。 23 parent::__construct($this->pattern, $this->flags); 24 } 25 26 /** 27 * このイテレータが内部で使用している検索パターンを返します。 28 * コンストラクタプロモーションによって宣言されたプロパティにアクセスしています。 29 * 30 * @return string 検索パターン 31 */ 32 public function getSearchPattern(): string 33 { 34 return $this->pattern; 35 } 36 37 /** 38 * このクラスの利用例と、テストファイルのセットアップ・クリーンアップを行うメソッド。 39 * 単体で動作可能なコードとして、全てのロジックをこのクラス内に含めています。 40 * 41 * @param string $testDir テストファイルを一時的に作成するディレクトリパス 42 */ 43 public static function demonstrateUsage(string $testDir): void 44 { 45 // -------------------------------------------------- 46 // テストファイルの準備 47 // -------------------------------------------------- 48 if (!is_dir($testDir)) { 49 mkdir($testDir, 0777, true); 50 } 51 file_put_contents($testDir . '/document1.txt', 'This is document 1.'); 52 file_put_contents($testDir . '/log_file.log', 'Log entry: something happened.'); 53 file_put_contents($testDir . '/image.jpg', 'Binary image data.'); 54 55 try { 56 echo "--- GlobIterator::__construct と PHP 8 コンストラクタプロモーションの例 ---\n\n"; 57 58 // -------------------------------------------------- 59 // .txt ファイルを検索するイテレータの作成と利用 60 // -------------------------------------------------- 61 echo "■ .txt ファイルを検索:\n"; 62 // MyPatternFileFinder をインスタンス化。 63 // コンストラクタプロモーションにより、$pattern プロパティが自動的に設定されます。 64 $txtFinder = new MyPatternFileFinder($testDir . '/*.txt'); 65 66 echo " 検索パターン: " . $txtFinder->getSearchPattern() . "\n"; 67 echo " 見つかったファイル:\n"; 68 69 if ($txtFinder->count() > 0) { 70 foreach ($txtFinder as $fileInfo) { 71 echo " - " . $fileInfo->getFilename() . " (フルパス: " . $fileInfo->getPathname() . ")\n"; 72 } 73 } else { 74 echo " - .txt ファイルは見つかりませんでした。\n"; 75 } 76 77 echo "\n"; 78 79 // -------------------------------------------------- 80 // .log ファイルを検索するイテレータの作成と利用 81 // -------------------------------------------------- 82 echo "■ .log ファイルを検索:\n"; 83 $logFinder = new MyPatternFileFinder($testDir . '/*.log'); 84 85 echo " 検索パターン: " . $logFinder->getSearchPattern() . "\n"; 86 echo " 見つかったファイル:\n"; 87 if ($logFinder->count() > 0) { 88 foreach ($logFinder as $fileInfo) { 89 echo " - " . $fileInfo->getFilename() . " (フルパス: " . $fileInfo->getPathname() . ")\n"; 90 } 91 } else { 92 echo " - .log ファイルは見つかりませんでした。\n"; 93 } 94 95 } finally { 96 // -------------------------------------------------- 97 // テストファイルのクリーンアップ 98 // -------------------------------------------------- 99 if (is_dir($testDir)) { 100 // ディレクトリ内の全てのファイルを削除 101 foreach (glob($testDir . '/*') as $file) { 102 if (is_file($file)) { 103 unlink($file); 104 } 105 } 106 // 空になったディレクトリを削除 107 rmdir($testDir); 108 } 109 } 110 } 111} 112 113// -------------------------------------------------- 114// スクリプトのエントリーポイント 115// -------------------------------------------------- 116// MyPatternFileFinder クラスの demonstrateUsage メソッドを呼び出し、 117// 全ての処理を実行します。 118MyPatternFileFinder::demonstrateUsage(__DIR__ . '/temp_glob_test'); 119 120?>
PHPのGlobIteratorクラスは、ファイルシステム上で特定のパターンに一致するファイルやディレクトリを効率的に検索し、それらを順に処理するためのイテレータを提供します。このクラスのコンストラクタである__constructメソッドは、GlobIteratorオブジェクトを初期化する際に使用されます。
引数として、string $patternには検索したいファイルパスのパターン(例: /path/to/*.txtのようなワイルドカードを含む文字列)を指定します。オプションのint $flagsには、FilesystemIteratorクラスで定義された定数を組み合わせて、検索結果の形式や挙動を細かく設定できます。このメソッド自体はオブジェクトを初期化するだけで、戻り値はありません。
サンプルコードでは、GlobIteratorを継承したMyPatternFileFinderクラスが、PHP 8で導入された「コンストラクタプロモーション」という機能を利用しています。これは、コンストラクタの引数を直接クラスのプロパティとして宣言し、同時に初期化できる便利な記法です。これにより、コードの記述量を減らし、より簡潔にプロパティを定義できます。MyPatternFileFinderは、このプロモーションで受け取った$patternと$flagsを内部プロパティとして保持しつつ、それらを親クラスであるGlobIteratorのコンストラクタに渡し、指定されたパターンに基づいてファイルを検索するイテレータとして動作します。
GlobIteratorは、指定したパターンに一致するファイルを検索する際に役立つクラスです。コンストラクタの$pattern引数には、/path/*.txtのようなシェル形式のワイルドカードパターンを正しく指定する必要があります。ファイルが見つからない場合は、イテレータが空となるだけでエラーにはなりません。第二引数$flagsは、FilesystemIteratorの定数を組み合わせてイテレータの挙動を調整できます。サンプルコードで用いているPHP 8の「コンストラクタプロモーション」は、引数をプロパティとして宣言し初期化する簡潔な記法です。これを使う場合でも、継承している親クラスのコンストラクタはparent::__constructで明示的に呼び出し、必要な引数を渡すことを忘れないでください。また、ファイルパスを扱う際は、セキュリティに注意し、一時ファイルを生成した場合は必ず適切に削除するようにしましょう。
PHP 8 Constructor Property Promotion による GlobIterator の利用
1<?php 2 3use FilesystemIterator; 4use GlobIterator; // GlobIterator クラスのインポート 5 6/** 7 * GlobIterator を内部で利用し、PHP 8 の Constructor Property Promotion を示すクラス。 8 * 9 * システムエンジニアを目指す初心者の方へ: 10 * このクラスは、指定されたパターンに一致するファイルを検索するために GlobIterator を利用します。 11 * PHP 8 で導入された「Constructor Property Promotion」という機能を使って、 12 * コンストラクタの引数として渡された GlobIterator のインスタンスを、 13 * そのままクラスのプライベートプロパティとして宣言・初期化しています。 14 * これにより、冗長なプロパティ宣言と代入のコードを削減し、より簡潔に記述できます。 15 */ 16class FileSearcher 17{ 18 // PHP 8 の Constructor Property Promotion を利用。 19 // コンストラクタ引数 $iterator を受け取り、同時に private プロパティ $iterator として宣言・初期化。 20 public function __construct( 21 private GlobIterator $iterator // GlobIterator のインスタンスを受け取る 22 ) {} 23 24 /** 25 * 見つかったファイルをリストアップするメソッド。 26 * 内部で保持している GlobIterator を使ってファイルを反復処理します。 27 */ 28 public function listFiles(): void 29 { 30 // イテレータが有効な要素を持っているか確認 31 if (!$this->iterator->valid()) { 32 echo "指定されたパターンに一致するファイルは見つかりませんでした。\n"; 33 return; 34 } 35 36 echo "見つかったファイル:\n"; 37 // GlobIterator は SplFileInfo のインスタンスを返すので、ファイル名などの情報にアクセスできます 38 foreach ($this->iterator as $file) { 39 echo "- " . $file->getFilename() . " (フルパス: " . $file->getPathname() . ")\n"; 40 } 41 } 42} 43 44// --- サンプルコードの実行部分 --- 45 46// 検索対象のディレクトリと一時ファイルを作成 47$tempDir = __DIR__ . '/temp_search_example'; 48if (!is_dir($tempDir)) { 49 mkdir($tempDir, 0777, true); // ディレクトリが存在しない場合は作成 50} 51file_put_contents($tempDir . '/document_a.txt', 'Content for A'); 52file_put_contents($tempDir . '/image_b.jpg', 'Binary content B'); 53file_put_contents($tempDir . '/document_c.txt', 'Content for C'); 54file_put_contents($tempDir . '/.hidden_file.txt', 'This should be skipped'); // ドットファイル 55 56// GlobIterator のパターンを定義 57// temp_search_example ディレクトリ内の '.txt' 拡張子のファイルを検索 58$pattern = $tempDir . '/*.txt'; 59 60// GlobIterator のフラグを定義 61// FilesystemIterator::CURRENT_AS_FILEINFO: 各要素を SplFileInfo オブジェクトとして扱う 62// FilesystemIterator::SKIP_DOTS: . と .. および .で始まるファイルをスキップする 63$flags = FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS; 64 65// GlobIterator のインスタンスを生成 66// ここで GlobIterator::__construct が呼び出され、検索パターンとフラグが設定されます。 67$globIteratorInstance = new GlobIterator($pattern, $flags); 68 69// FileSearcher クラスのインスタンスを生成 70// このとき、GlobIterator のインスタンスが Constructor Property Promotion によって $searcher オブジェクトの 71// private プロパティ $iterator に自動的にセットされます。 72$searcher = new FileSearcher($globIteratorInstance); 73 74// ファイルをリストアップするメソッドを呼び出す 75$searcher->listFiles(); 76 77// --- 後処理 (作成した一時ファイルとディレクトリを削除) --- 78array_map('unlink', glob($tempDir . '/*')); // ディレクトリ内のファイルを削除 79rmdir($tempDir); // ディレクトリ自体を削除 80 81?>
PHPのGlobIteratorクラスのコンストラクタ(__construct)は、指定されたパターンに合致するファイルやディレクトリを効率的に検索するためのイテレータを初期化します。引数$patternには*.txtのようなワイルドカードを含む検索パスを指定し、$flagsはFilesystemIterator::CURRENT_AS_FILEINFOで結果をファイル情報として取得したり、FilesystemIterator::SKIP_DOTSで.や..をスキップしたりと、検索の挙動を制御するオプションを指定します。コンストラクタはインスタンスを生成するため、明示的な戻り値はありません。
サンプルコードでは、PHP 8の「Constructor Property Promotion」が活用されています。これは、コンストラクタの引数宣言時に可視性を指定することで、その引数を自動的にクラスのプロパティとして宣言・初期化し、コードを簡潔にする機能です。FileSearcherクラスは、この機能を使ってGlobIteratorのインスタンスをプライベートプロパティとして受け取っています。その後、listFilesメソッド内でこのイテレータを利用し、一時ディレクトリに作成された.txtファイルを検索して、ファイル名とフルパスを表示しています。この例は、GlobIteratorとConstructor Property Promotionの効果的な連携を示しています。
GlobIterator の第一引数 $pattern は、シェル形式のワイルドカードを正確に指定してください。誤ったパターンでは、期待するファイルが見つからない場合があります。第二引数 $flags で FilesystemIterator::CURRENT_AS_FILEINFO を指定すると、foreach で SplFileInfo オブジェクトを取得でき、ファイルの詳細情報にアクセスしやすくなります。このフラグがないと、ファイルパスの文字列が直接返されるため注意が必要です。サンプルコードの FileSearcher クラスで使われている Constructor Property Promotion は、PHP 8で導入された機能です。コンストラクタの引数で直接プロパティを宣言・初期化できる便利な記法ですが、利用するPHPのバージョンが8未満の場合、文法エラーとなりますのでご注意ください。