Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】GlobIterator::setInfoClass()メソッドの使い方

setInfoClassメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

GlobIterator::setInfoClassメソッドは、GlobIteratorがファイルやディレクトリの情報を提供する際に使用する情報クラスを設定するメソッドです。

GlobIteratorは、指定されたパターンに合致するファイルやディレクトリを効率的に繰り返し処理するためのPHPのクラスです。通常、このイテレータは、各ファイルやディレクトリの詳細情報をSplFileInfoというPHP標準のクラスのオブジェクトとして提供します。SplFileInfoオブジェクトには、ファイル名、サイズ、更新日時などの基本的な情報が格納されていますが、システム開発においては、これらの情報に加えて独自の機能やデータを付与したいケースがあります。

setInfoClassメソッドを利用することで、開発者はSplFileInfoを継承したカスタムクラスを指定できるようになります。これにより、GlobIteratorが返す情報オブジェクトが、指定されたカスタムクラスのインスタンスとして生成されるようになります。例えば、特定のファイルタイプに特化した処理を行うメソッドをカスタムクラスに追加したり、ファイルパスから導出される追加のメタデータを保持するプロパティを定義したりすることが可能になります。この機能は、ファイルシステムを操作する際に、標準の情報オブジェクトを拡張し、より柔軟でアプリケーション固有のロジックを組み込みたい場合に非常に役立ちます。このメソッドは、イテレータがファイル情報を取得する前に呼び出す必要があります。

構文(syntax)

1<?php
2// GlobIterator クラスのインスタンスを作成します。
3$globIterator = new GlobIterator(__DIR__);
4
5// setInfoClass メソッドを呼び出し、返すオブジェクトのクラス名を文字列で指定します。
6// この例ではPHP標準の SplFileInfo クラスを指定しています。
7$globIterator->setInfoClass('SplFileInfo');
8?>

引数(parameters)

?string $class = null

  • ?string $class = null: GlobIterator の情報取得に使用するクラス名を指定します。指定しない場合は、デフォルトの GlobIterator が使用されます。

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP GlobIterator でカスタムクラスを使用する

1<?php
2
3/**
4 * SplFileInfo を継承したカスタムクラス。
5 * GlobIterator::setInfoClass() を使用して、このクラスのインスタンスを返すように設定できます。
6 */
7class MyCustomFileInfo extends SplFileInfo
8{
9    /**
10     * このカスタムクラス独自の情報を返すメソッド。
11     *
12     * @return string
13     */
14    public function getMyCustomInfo(): string
15    {
16        return "このファイルはMyCustomFileInfoクラスによって処理されました。パス: " . $this->getPathname();
17    }
18}
19
20// 動作確認のために一時的なファイルを作成します。
21$tempDir = __DIR__ . '/temp_glob_dir';
22if (!is_dir($tempDir)) {
23    mkdir($tempDir);
24}
25file_put_contents($tempDir . '/file_a.txt', 'Content A');
26file_put_contents($tempDir . '/file_b.log', 'Content B');
27
28echo "--- GlobIterator::setInfoClass() の使用例 ---\n\n";
29
30// 1. デフォルトの SplFileInfo クラスでの挙動を確認
31echo "デフォルトのSplFileInfoクラスでファイル情報取得:\n";
32$defaultIterator = new GlobIterator($tempDir . '/*');
33foreach ($defaultIterator as $fileInfo) {
34    // get_class() 関数で、返されたオブジェクトのクラス名を確認します。
35    echo "  ファイル名: " . $fileInfo->getFilename() . " (クラス: " . get_class($fileInfo) . ")\n";
36}
37echo "\n";
38
39// 2. setInfoClass() を使用して、カスタムクラスを設定
40echo "MyCustomFileInfoクラスを設定してファイル情報取得:\n";
41$customIterator = new GlobIterator($tempDir . '/*');
42// setInfoClass() メソッドに、使用したいカスタムクラスの完全修飾名を渡します。
43// MyCustomFileInfo::class は PHP 5.5以降で推奨されるクラス名取得の方法です。
44$customIterator->setInfoClass(MyCustomFileInfo::class);
45
46foreach ($customIterator as $fileInfo) {
47    // setInfoClass() の設定により、MyCustomFileInfo クラスのインスタンスが返されます。
48    echo "  ファイル名: " . $fileInfo->getFilename() . " (クラス: " . get_class($fileInfo) . ")\n";
49
50    // MyCustomFileInfo クラスのインスタンスであれば、独自のメソッドを呼び出すことができます。
51    if ($fileInfo instanceof MyCustomFileInfo) {
52        echo "    - " . $fileInfo->getMyCustomInfo() . "\n";
53    }
54}
55
56echo "\n--- クリーンアップ ---\n";
57// 作成した一時ファイルとディレクトリを削除します。
58unlink($tempDir . '/file_a.txt');
59unlink($tempDir . '/file_b.log');
60rmdir($tempDir);
61echo "一時ファイルとディレクトリを削除しました。\n";
62
63?>

GlobIteratorクラスは、指定したパターンに合致するファイルやディレクトリの情報を取得するイテレータです。通常、このイテレータが返す各ファイル情報はSplFileInfoクラスのインスタンスですが、setInfoClassメソッドを使用することで、返すオブジェクトのクラスを変更できます。

引数$classには、SplFileInfoを継承したカスタムクラスの完全修飾名(文字列)を指定します。この引数をnullにすると、デフォルトのSplFileInfoクラスに戻ります。setInfoClassメソッド自体は戻り値を持ちません。

この機能を利用すると、ファイル情報オブジェクトに独自のメソッドやプロパティを追加したカスタムクラスを使用できるようになり、ファイル処理の柔軟性が向上します。サンプルコードでは、MyCustomFileInfoというSplFileInfoを継承したクラスを作成し、setInfoClass(MyCustomFileInfo::class)と設定しています。これにより、GlobIteratorMyCustomFileInfoのインスタンスを返すようになり、get_class()関数で確認できるクラス名がMyCustomFileInfoになります。さらに、カスタムクラス独自のメソッドであるgetMyCustomInfo()を呼び出し、ファイルパスを含む独自の情報を取得する様子が示されています。MyCustomFileInfo::classのように::class定数を使用すると、クラス名をタイプミスなく正確に指定できます。

GlobIterator::setInfoClass()を使用する際は、指定するカスタムクラスが必ずSplFileInfoを継承している必要があります。継承しないとファイル情報の取得が正しく行えない可能性があります。引数には、使用したいカスタムクラスの完全修飾名を文字列として渡してください。MyCustomFileInfo::classのようにクラス定数を使うのが、タイプミスを防ぎ、より安全な方法です。このメソッドは、ファイルシステムを走査して得られる個々のファイル情報を、指定されたクラスのインスタンスとして取得できるようにするためのものです。独自のプロパティやメソッドを追加して、ファイル情報に独自の処理を組み込みたい場合に活用できます。メソッドの戻り値がないため、呼び出し後に特別な戻り値チェックは不要です。

GlobIterator でクラス名を取得する

1<?php
2
3/**
4 * GlobIteratorが返すSplFileInfoオブジェクトをカスタマイズするためのクラス。
5 * SplFileInfoを継承する必要があります。
6 */
7class MyCustomFileInfo extends SplFileInfo
8{
9    /**
10     * このカスタムクラス独自のメソッド。
11     * ファイル名を含むカスタムメッセージを返します。
12     *
13     * @return string カスタム情報メッセージ
14     */
15    public function getCustomDetail(): string
16    {
17        return "カスタム情報: このファイルは " . $this->getFilename() . " です。";
18    }
19}
20
21// GlobIteratorの動作をテストするための一時ディレクトリとファイルを作成します。
22$testDir = __DIR__ . '/temp_glob_test_dir';
23if (!is_dir($testDir)) {
24    mkdir($testDir);
25}
26file_put_contents($testDir . '/document1.txt', 'Sample text 1');
27file_put_contents($testDir . '/image2.jpg', 'Binary image data');
28
29try {
30    // GlobIteratorを初期化し、指定されたディレクトリ内のすべてのアイテムを探索するパターンを設定します。
31    $globPattern = $testDir . '/*';
32    $iterator = new GlobIterator($globPattern);
33
34    // setInfoClassメソッドを使用して、イテレータがMyCustomFileInfoクラスのインスタンスを返すように設定します。
35    // MyCustomFileInfo::class は、PHP 5.5以降でクラス名を文字列として取得する推奨の方法です。
36    $iterator->setInfoClass(MyCustomFileInfo::class);
37
38    echo "GlobIteratorが返すオブジェクトのクラス名とカスタム情報を確認します。\n";
39    echo "--------------------------------------------------------\n";
40
41    $firstFoundObject = null; // 後で検証するために、最初に見つかったオブジェクトを記録します。
42
43    // イテレータを反復処理し、各ファイルオブジェクトの情報を表示します。
44    foreach ($iterator as $fileObject) {
45        // get_class() 関数を使ってオブジェクトのクラス名を取得します。
46        $className = get_class($fileObject);
47        echo "ファイル: " . $fileObject->getFilename() . " | クラス: " . $className;
48
49        // 返されたオブジェクトがMyCustomFileInfoのインスタンスであれば、カスタムメソッドを呼び出します。
50        if ($fileObject instanceof MyCustomFileInfo) {
51            echo " | " . $fileObject->getCustomDetail();
52        }
53        echo "\n";
54
55        if ($firstFoundObject === null) {
56            $firstFoundObject = $fileObject;
57        }
58    }
59
60    echo "--------------------------------------------------------\n";
61
62    // 最初のファイルオブジェクトのクラス名が、設定したMyCustomFileInfoであるかを検証します。
63    if ($firstFoundObject !== null) {
64        $expectedClassName = MyCustomFileInfo::class;
65        $actualClassName = get_class($firstFoundObject);
66
67        echo "設定されたカスタムクラス名: " . $expectedClassName . "\n";
68        echo "実際に返されたオブジェクトのクラス名: " . $actualClassName . "\n";
69
70        if ($actualClassName === $expectedClassName) {
71            echo "検証結果: GlobIteratorは期待通り '" . $expectedClassName . "' のインスタンスを返しました。\n";
72        } else {
73            echo "検証結果: エラー - 期待されたクラス '" . $expectedClassName . "' とは異なるクラス '" . $actualClassName . "' が返されました。\n";
74        }
75    } else {
76        echo "探索パターンにマッチするファイルが見つかりませんでした。\n";
77    }
78
79} finally {
80    // テスト後に作成した一時ディレクトリとファイルをクリーンアップします。
81    if (is_dir($testDir)) {
82        foreach (glob($testDir . '/*') as $item) {
83            unlink($item);
84        }
85        rmdir($testDir);
86    }
87}

GlobIterator::setInfoClassメソッドは、PHPのGlobIteratorがファイルやディレクトリを反復処理する際に返すオブジェクトの種類をカスタマイズするための機能です。通常、GlobIteratorはファイル情報を扱うためのSplFileInfoクラスのインスタンスを返しますが、このメソッドを使うと、開発者が作成した独自のクラスのインスタンスを返させることができます。

引数$classには、利用したいカスタムクラスの完全な名前を文字列で渡します。例えば、MyCustomFileInfo::classのように::class定数を使用すると、クラス名のタイポを防ぎ、安全に指定できます。このカスタムクラスは、通常SplFileInfoクラスを継承して作成します。継承することで、元のSplFileInfoが持つファイル名やパスなどの基本的な情報を引き続き利用しながら、独自のメソッドやプロパティを追加できるようになります。このメソッドには戻り値がなく、呼び出すだけでGlobIteratorの内部的な挙動が変更されます。

サンプルコードでは、SplFileInfoを継承したMyCustomFileInfoクラスを作成し、独自のgetCustomDetail()メソッドを追加しています。$iterator->setInfoClass(MyCustomFileInfo::class);と設定することで、GlobIteratorはファイルが見つかるたびにMyCustomFileInfoのインスタンスを返すようになります。これにより、GlobIteratorから取得したファイルオブジェクトに対して、通常のファイル情報に加えてカスタムクラスで定義した独自の処理を実行できるようになります。get_class()関数を使えば、実際に返されたオブジェクトが設定通りのカスタムクラスのインスタンスであるかを確認できます。

GlobIterator::setInfoClassで指定するカスタムクラスは、必ずPHP標準のSplFileInfoクラスを継承する必要があります。継承しない場合、期待通りに動作せず、実行時エラーや予期せぬ挙動につながることがあります。クラス名を指定する際には、MyCustomFileInfo::classのように::class定数を用いる方法が、タイプミスを防ぎ、より安全で推奨されます。このメソッドは、GlobIteratorがファイル情報オブジェクトを生成する際のクラスを設定するものであり、既に生成されたオブジェクトのクラスを変更するものではない点にご注意ください。また、サンプルコードのように一時ディレクトリやファイルを作成した場合は、try-finally構文を使ってプログラム終了時に確実に削除する習慣をつけましょう。これはテスト環境や開発環境をきれいに保つ上で非常に重要です。

関連コンテンツ

関連IT用語

関連プログラミング言語