【PHP8.x】DirectoryIterator::setInfoClass()メソッドの使い方
setInfoClassメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
setInfoClassメソッドは、DirectoryIteratorオブジェクトが返すファイル情報のクラスを設定するメソッドです。DirectoryIteratorは、ファイルシステム上のディレクトリの内容を一つずつ処理するためのオブジェクトで、ディレクトリ内の各ファイルやサブディレクトリの情報を取得します。通常、この情報はPHPに組み込まれているSplFileInfoクラスのインスタンスとして提供されます。
このsetInfoClassメソッドを利用することで、デフォルトのSplFileInfoクラスではなく、開発者が独自に作成したクラスのインスタンスでファイル情報を取得できるように指定できます。例えば、SplFileInfoクラスを継承して、ファイル名から特定の情報を抽出する独自のメソッドを追加したカスタムクラスを作成した場合、setInfoClassメソッドにそのカスタムクラス名を渡すことで、DirectoryIteratorはそのカスタムクラスのオブジェクトを返します。
この機能は、ファイルシステムから取得した情報に、アプリケーション固有の追加データや操作ロジックを組み込みたい場合に非常に役立ちます。引数として渡すクラス名は文字列であり、そのクラスはSplFileInfoクラスを継承している必要があります。これにより、ファイル情報の処理をより柔軟に、かつ拡張性のある形でカスタマイズすることが可能になります。PHP 8においても、このメカニズムは変更なく利用でき、ファイルシステム操作の高度なカスタマイズをサポートしています。
構文(syntax)
1$iterator->setInfoClass('CustomSplFileInfoClass');
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
DirectoryIteratorでカスタムクラスを使用する
1<?php 2 3/** 4 * SplFileInfoを継承したカスタムファイル情報クラス。 5 * DirectoryIteratorがこのカスタムクラスのインスタンスを返すように設定できます。 6 * これにより、ファイル情報オブジェクトに独自のメソッドやプロパティを追加できます。 7 */ 8class MyFileInfo extends SplFileInfo 9{ 10 /** 11 * このファイルオブジェクトに関するカスタム情報を返します。 12 * 13 * @return string ファイル名を含むカスタム情報文字列 14 */ 15 public function getCustomInfo(): string 16 { 17 return "カスタム情報: ファイル名「" . $this->getFilename() . "」は、" . __CLASS__ . "のインスタンスです。"; 18 } 19} 20 21// --- サンプルコードの実行部分 --- 22 23// DirectoryIteratorが処理する一時ディレクトリを作成します。 24$tempDir = __DIR__ . DIRECTORY_SEPARATOR . 'sample_dir_for_iterator_test'; 25if (!is_dir($tempDir)) { 26 mkdir($tempDir); 27} 28 29// テスト用のファイルをいくつか作成します。 30file_put_contents($tempDir . DIRECTORY_SEPARATOR . 'document.txt', 'これはテストドキュメントです。'); 31file_put_contents($tempDir . DIRECTORY_SEPARATOR . 'image.jpg', 'これはテスト画像です。'); 32file_put_contents($tempDir . DIRECTORY_SEPARATOR . 'report.pdf', 'これはテストレポートです。'); 33 34try { 35 // DirectoryIteratorのインスタンスを作成し、一時ディレクトリを指定します。 36 $iterator = new DirectoryIterator($tempDir); 37 38 // setInfoClass() メソッドを使用して、イテレータが返すファイル情報オブジェクトのクラスを設定します。 39 // ここで、先ほど定義したカスタムクラス「MyFileInfo」を設定します。 40 // これにより、DirectoryIteratorは通常のSplFileInfoではなくMyFileInfoのインスタンスを返します。 41 $iterator->setInfoClass(MyFileInfo::class); 42 43 echo "--- ディレクトリの走査を開始します ---" . PHP_EOL; 44 echo "対象ディレクトリ: " . $tempDir . PHP_EOL; 45 echo "期待されるオブジェクトのクラス: " . MyFileInfo::class . PHP_EOL . PHP_EOL; 46 47 // ディレクトリ内のファイルをループし、それぞれのファイル情報オブジェクトを取得します。 48 foreach ($iterator as $fileinfo) { 49 // . (カレントディレクトリ) と .. (親ディレクトリ) はスキップします。 50 if ($fileinfo->isDot()) { 51 continue; 52 } 53 54 // 「php get class」キーワードに関連: 取得されたオブジェクトの実際のクラス名を取得します。 55 $className = get_class($fileinfo); 56 57 echo "ファイル名: " . $fileinfo->getFilename() . PHP_EOL; 58 echo " 取得されたオブジェクトのクラス: " . $className . PHP_EOL; 59 60 // もしオブジェクトがMyFileInfoクラスのインスタンスであれば、カスタムメソッドを呼び出します。 61 if ($fileinfo instanceof MyFileInfo) { 62 echo " " . $fileinfo->getCustomInfo() . PHP_EOL; 63 } 64 echo PHP_EOL; 65 } 66 67} catch (Exception $e) { 68 // エラーが発生した場合、メッセージを表示します。 69 echo "エラーが発生しました: " . $e->getMessage() . PHP_EOL; 70} finally { 71 // --- クリーンアップ処理 --- 72 // 作成した一時ディレクトリとその中のファイルを削除します。 73 if (is_dir($tempDir)) { 74 // ディレクトリ内のファイルを削除 75 foreach (new DirectoryIterator($tempDir) as $file) { 76 if (!$file->isDot()) { 77 unlink($file->getPathname()); 78 } 79 } 80 // ディレクトリ自体を削除 81 rmdir($tempDir); 82 echo "一時ディレクトリ「" . $tempDir . "」をクリーンアップしました。" . PHP_EOL; 83 } 84 echo "--- ディレクトリの走査を終了しました ---" . PHP_EOL; 85}
PHPのDirectoryIterator::setInfoClass()メソッドは、DirectoryIteratorがディレクトリ内のファイルを走査した際に返すファイル情報オブジェクトのクラスを指定するために使用します。通常、DirectoryIteratorはSplFileInfoクラスのインスタンスを返しますが、このメソッドにカスタムクラス名を引数として渡すことで、SplFileInfoを継承した独自のカスタムクラスを代わりに返すように設定できます。戻り値はありません。
このメソッドを使うことで、ファイル情報オブジェクトに独自のメソッドやプロパティを追加し、より高度なファイル操作を実現できます。サンプルコードでは、SplFileInfoを継承したMyFileInfoというカスタムクラスを定義し、ファイルに関するカスタム情報を返すgetCustomInfo()メソッドを持たせています。$iterator->setInfoClass(MyFileInfo::class);と呼び出すことで、DirectoryIteratorは以降、MyFileInfoのインスタンスを生成するようになります。これにより、foreachループで取得したファイル情報オブジェクトはMyFileInfo型となり、get_class()で確認できるだけでなく、独自のgetCustomInfo()メソッドを呼び出せるようになります。
DirectoryIterator::setInfoClass() メソッドは、ディレクトリを走査する際に得られるファイル情報オブジェクトのクラスをカスタムしたい場合に利用します。カスタムクラスは必ず SplFileInfo を継承する必要があり、継承しないと正常に動作しませんのでご注意ください。リファレンス情報では引数なしとありますが、実際には設定したいカスタムクラスの完全修飾名を MyFileInfo::class のように引数として指定します。このメソッドは、DirectoryIterator のインスタンス作成後、実際にファイルを走査するループに入る前に一度だけ呼び出す必要があります。これにより、その後のファイル走査でカスタムクラスのインスタンスが返されるようになり、ファイル情報に独自のメソッドやプロパティを追加できます。返されたオブジェクトが期待するクラスであるかは、get_class() 関数や instanceof 演算子で確認して安全に利用しましょう。一時ファイルを扱う際は、必ず finally ブロックなどでクリーンアップ処理を行う習慣をつけることが大切です。
DirectoryIteratorのクラスを切り替える
1<?php 2 3// 一時的なディレクトリを作成します。 4$tempDir = __DIR__ . '/temp_dir_for_setinfoclass_example'; 5if (!is_dir($tempDir)) { 6 mkdir($tempDir); 7} 8// テストファイルを作成します。 9file_put_contents($tempDir . '/test_file.txt', 'Hello World'); 10 11/** 12 * SplFileInfoを継承したカスタムクラスです。 13 * DirectoryIterator::setInfoClass() メソッドの効果を示すために使用します。 14 */ 15class MyCustomFileInfo extends SplFileInfo 16{ 17 // 必要に応じて、カスタムメソッドやプロパティを追加できます。 18 // この例では、クラス名が変更されること自体が目的です。 19} 20 21echo "--- setInfoClass() 設定前 ---" . PHP_EOL; 22 23// DirectoryIterator をデフォルト設定でインスタンス化します。 24$iteratorDefault = new DirectoryIterator($tempDir); 25 26// イテレータをループし、最初の要素のクラス名を取得します。 27// デフォルトでは SplFileInfo クラスのインスタンスが返されます。 28foreach ($iteratorDefault as $fileInfo) { 29 // '.' (カレントディレクトリ) と '..' (親ディレクトリ) はスキップします。 30 if ($fileInfo->isDot()) { 31 continue; 32 } 33 echo "デフォルトのファイル情報のクラス名: " . get_class($fileInfo) . PHP_EOL; 34 break; // 最初のファイル情報で終了 35} 36 37echo PHP_EOL; 38echo "--- setInfoClass() 設定後 ---" . PHP_EOL; 39 40// DirectoryIterator を再度インスタンス化します。 41$iteratorCustom = new DirectoryIterator($tempDir); 42 43// setInfoClass() メソッドを使い、ファイル情報を返すクラスをカスタムクラスに設定します。 44// このメソッドは引数としてクラス名の文字列を受け取ります。 45$iteratorCustom->setInfoClass(MyCustomFileInfo::class); 46 47// 再びイテレータをループし、最初の要素のクラス名を取得します。 48// ここでは MyCustomFileInfo クラスのインスタンスが返されるはずです。 49foreach ($iteratorCustom as $fileInfo) { 50 // '.' と '..' はスキップします。 51 if ($fileInfo->isDot()) { 52 continue; 53 } 54 echo "カスタム設定後のファイル情報のクラス名: " . get_class($fileInfo) . PHP_EOL; 55 break; // 最初のファイル情報で終了 56} 57 58// 作成した一時ファイルとディレクトリをクリーンアップします。 59unlink($tempDir . '/test_file.txt'); 60rmdir($tempDir); 61
DirectoryIterator::setInfoClass() メソッドは、PHPの DirectoryIterator がディレクトリ内のファイルやサブディレクトリの情報を取得する際に、その情報を持つオブジェクトのクラスを指定するためのものです。通常、DirectoryIterator はファイル情報を SplFileInfo クラスのインスタンスとして返しますが、このメソッドを使用することで、SplFileInfo を継承した独自のカスタムクラスのインスタンスを返すように変更できます。
このメソッドは引数として、利用したいカスタムクラスの完全修飾クラス名の文字列を受け取ります。このメソッド自身は値を返しません。
サンプルコードでは、まず一時的なディレクトリとファイルを作成し、テスト環境を準備しています。次に、SplFileInfo を継承した MyCustomFileInfo というカスタムクラスを定義しています。
setInfoClass() を設定する前の DirectoryIterator を使用すると、ファイル情報のオブジェクトがデフォルトの SplFileInfo クラスのインスタンスであることが get_class() 関数で確認できます。
その後、$iteratorCustom->setInfoClass(MyCustomFileInfo::class) を呼び出すことで、次に DirectoryIterator をループした際に返されるファイル情報のオブジェクトが MyCustomFileInfo のインスタンスになるよう設定しています。これにより、ファイル情報オブジェクトに独自のメソッドやプロパティを追加し、特定の処理を組み込むことが可能になります。最後に、作成した一時ファイルを適切にクリーンアップしています。この機能は、ファイル情報に独自の機能を持たせたい場合に特に便利です。
setInfoClassメソッドは、DirectoryIteratorがディレクトリ内のファイルやディレクトリ情報を返す際に、その情報オブジェクトの型を変更するために使われます。デフォルトではSplFileInfoクラスのインスタンスが返されますが、このメソッドを使うと、SplFileInfoを継承した任意のカスタムクラスのインスタンスを返させることができます。
注意点として、引数には使用したいカスタムクラスの完全修飾名(例: MyCustomFileInfo::class)を文字列で渡す必要があります。また、そのカスタムクラスは必ずSplFileInfoを継承している必要があります。このメソッドは、DirectoryIteratorのループを開始する前に一度だけ設定してください。ループ開始後に設定しても、すでに取得済みのファイル情報オブジェクトの型は変更されません。