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

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

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

作成日: 更新日:

基本的な使い方

getFilenameメソッドは、GlobIteratorが現在指しているファイルまたはディレクトリのファイル名(ベース名)を取得するメソッドです。GlobIteratorは、PHPにおいて、指定されたファイルパターン(例: *.txt)に一致するファイルやディレクトリをファイルシステムから検索し、順に反復処理するためのクラスです。このメソッドは、ファイルシステムの要素を一つずつ処理する際に、それぞれの要素の識別名を簡単に取り出すために使用されます。

反復処理中にこのメソッドを呼び出すと、現在のイテレータ項目が表すフルパスから、パスの末尾にあるファイル名やディレクトリ名のみを返します。例えば、「/var/www/html/index.php」というフルパスであれば「index.php」を、「/var/log/apache2」というフルパスであれば「apache2」を返します。これにより、完全なパス全体を扱うことなく、ファイルやディレクトリの固有の名前部分を効率的に取得することができます。

本機能は、特定の条件に合致するファイル群の名前だけをリストアップする際や、取得したパスの中からファイル名部分のみを抽出して別の処理に利用する際に特に有用です。例えば、ウェブサイトのアップロードディレクトリ内の画像ファイルの名前を取得し、それらを一覧表示するようなシナリオで活用できます。getFilenameメソッドは、SplFileInfo::getFilename() と同様に、ファイルやディレクトリのベース名を簡潔に取得する役割を果たします。

構文(syntax)

1<?php
2// 現在のディレクトリにある全てのPHPファイルに対してGlobIteratorを作成
3$iterator = new GlobIterator(__DIR__ . '/*.php');
4
5// 見つかった各ファイルについて反復処理
6foreach ($iterator as $fileInfo) {
7    // 現在のファイル情報のファイル名(パス部分を含まない)を取得して出力
8    echo $fileInfo->getFilename() . "\n";
9}
10?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

GlobIterator クラスの getFilename メソッドは、現在処理中のファイル名の文字列を返します。

サンプルコード

PHP GlobIterator::getFilename でファイル名を取得する

1<?php
2
3/**
4 * Demonstrates the use of GlobIterator::getFilename() to retrieve filenames
5 * that match a specific pattern.
6 *
7 * This function creates temporary files, iterates through them using GlobIterator,
8 * and then cleans up the created files and directory.
9 */
10function demonstrateGlobIteratorGetFilename(): void
11{
12    // Define a unique temporary directory for testing
13    $tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'glob_example_' . uniqid();
14
15    // Attempt to create the temporary directory
16    if (!mkdir($tempDir) && !is_dir($tempDir)) {
17        echo "Error: Could not create temporary directory at $tempDir\n";
18        return;
19    }
20
21    // List of dummy files to create inside the temporary directory
22    $filesToCreate = ['report_2023.txt', 'image.jpg', 'document.pdf', 'report_2024.txt'];
23
24    // Create the dummy files with some content
25    foreach ($filesToCreate as $filename) {
26        file_put_contents($tempDir . DIRECTORY_SEPARATOR . $filename, "Content for $filename");
27    }
28
29    echo "Searching for '*.txt' files in '$tempDir' using GlobIterator::getFilename():\n\n";
30
31    try {
32        // Construct the glob pattern including the temporary directory
33        // GLOB_BRACE allows multiple patterns like {*.txt,*.pdf}
34        // GLOB_MARK adds a slash to directories (not relevant here as we expect files)
35        // GLOB_NOSORT returns files as they appear in the directory (default for GlobIterator)
36        $pattern = $tempDir . DIRECTORY_SEPARATOR . '*.txt';
37
38        // Create a GlobIterator instance for files matching the pattern
39        $iterator = new GlobIterator($pattern);
40
41        // Iterate over the matching files
42        foreach ($iterator as $fileInfo) {
43            // Retrieve the filename of the current item using the GlobIterator's own method.
44            // When iterating, the GlobIterator object itself points to the current item.
45            echo "- Found: " . $iterator->getFilename() . "\n";
46        }
47
48    } catch (UnexpectedValueException $e) {
49        // Handle cases where the glob pattern is invalid or directory not found
50        echo "Error creating GlobIterator: " . $e->getMessage() . "\n";
51    } catch (Exception $e) {
52        // Catch any other unexpected errors
53        echo "An unexpected error occurred: " . $e->getMessage() . "\n";
54    } finally {
55        // --- Cleanup section ---
56        // Ensure temporary files and directory are removed, regardless of errors.
57        echo "\nCleaning up temporary files and directory...\n";
58        foreach ($filesToCreate as $filename) {
59            $filePath = $tempDir . DIRECTORY_SEPARATOR . $filename;
60            if (file_exists($filePath)) {
61                unlink($filePath); // Delete each dummy file
62            }
63        }
64        if (is_dir($tempDir)) {
65            rmdir($tempDir); // Delete the temporary directory
66        }
67        echo "Cleanup complete.\n";
68    }
69}
70
71// Execute the demonstration function
72demonstrateGlobIteratorGetFilename();

PHP 8のGlobIterator::getFilename()メソッドは、ファイルシステムを探索し、指定したパターンに合致するファイルやディレクトリを反復処理する際に、現在処理している要素のファイル名を取得するために使用されます。このメソッドは引数を受け取らず、現在の要素のファイル名を表す文字列を戻り値として返します。

提供されたサンプルコードでは、一時ディレクトリを作成し、その中にいくつかのダミーファイルを生成しています。その後、GlobIteratorクラスを利用して、この一時ディレクトリ内から「*.txt」というファイル名パターンに合致するファイルのみを検索しています。foreachループを使ってイテレータを処理する際、$iterator->getFilename()を呼び出すことで、現在イテレータが指しているファイルから、ディレクトリパスを含まない純粋なファイル名だけを簡単に取り出し、画面に表示しています。この一連の流れは、GlobIteratorで検索した結果から、目的のファイル名のみを簡潔に取得する具体的な方法を示しています。

GlobIterator::getFilename()は、現在処理中のファイル名のみを返します。ファイル名だけでなくパス全体が必要な場合は、getPathname()などのメソッドを使い分けてください。このサンプルコードのように、一時ファイルを扱う際は、finallyブロックで作成したファイルやディレクトリを確実に削除する「クリーンアップ処理」を実装することが非常に重要です。これにより、プログラムの実行結果に関わらず、システムを綺麗な状態に保てます。また、try-catchによる適切なエラーハンドリングは、予期せぬ問題発生時にもプログラムが安全に動作し続けるために不可欠です。

PHP GlobIteratorでファイル名を取得する

1<?php
2
3/**
4 * GlobIterator::getFilename() メソッドのサンプルコード。
5 *
6 * この関数は、GlobIterator を使用して指定されたパターンに一致するファイル名を検索し、
7 * 各ファイルのファイル名を GlobIterator::getFilename() メソッドで取得して表示します。
8 *
9 * GlobIterator は、ファイルシステムを反復処理するためのイテレータであり、
10 * getFilename() メソッドは、現在のイテレータが指している項目(ファイルまたはディレクトリ)の
11 * ファイル名部分(パスを含まない)を返します。
12 */
13function demonstrateGlobIteratorGetFilename(): void
14{
15    // 1. サンプルファイルを作成するための準備
16    $tempDir = __DIR__ . '/temp_glob_example';
17    // ディレクトリが存在しない場合は作成
18    if (!is_dir($tempDir)) {
19        mkdir($tempDir, 0777, true);
20    }
21
22    $sampleFiles = ['report.txt', 'image.jpg', 'document.pdf'];
23
24    // サンプルファイルを一時ディレクトリ内に作成
25    foreach ($sampleFiles as $fileName) {
26        file_put_contents($tempDir . '/' . $fileName, "これは {$fileName} の内容です。");
27        echo "作成したファイル: " . $tempDir . '/' . $fileName . "\n";
28    }
29    echo "\n";
30
31    // 2. GlobIterator を使用してファイル名を反復処理
32    echo "GlobIterator を使用してファイル名をリストアップ:\n";
33    try {
34        // 一時ディレクトリ内のすべてのファイルを対象とするGlobIteratorを作成します。
35        // 指定するパターンは、シェルがファイルを展開するのと同じ形式です。
36        $iterator = new GlobIterator($tempDir . '/*');
37
38        // イテレータをループ処理し、各ファイルのファイル名を取得して表示します。
39        foreach ($iterator as $fileInfo) {
40            // getFilename() メソッドは、現在の項目(ファイル)のファイル名部分のみを返します。
41            // 例: '/path/to/report.txt' から 'report.txt' を取得します。
42            echo "  取得されたファイル名: " . $fileInfo->getFilename() . "\n";
43        }
44
45        // 一致するファイルがなかった場合のメッセージ
46        if (count($iterator) === 0) {
47            echo "  指定されたパターンに一致するファイルは見つかりませんでした。\n";
48        }
49    } catch (Exception $e) {
50        echo "エラーが発生しました: " . $e->getMessage() . "\n";
51    } finally {
52        // 3. 後処理: 作成したサンプルファイルとディレクトリを削除
53        echo "\n一時ファイルのクリーンアップ中...\n";
54        foreach ($sampleFiles as $fileName) {
55            $filePath = $tempDir . '/' . $fileName;
56            if (file_exists($filePath)) {
57                unlink($filePath); // ファイルを削除
58                echo "  削除されたファイル: " . $filePath . "\n";
59            }
60        }
61        if (is_dir($tempDir)) {
62            rmdir($tempDir); // ディレクトリを削除
63            echo "  削除されたディレクトリ: " . $tempDir . "\n";
64        }
65    }
66}
67
68// 関数の実行
69demonstrateGlobIteratorGetFilename();
70

PHPのGlobIterator::getFilename()メソッドは、ファイルシステムを反復処理するGlobIteratorオブジェクトにおいて、現在イテレータが指している項目(ファイルやディレクトリ)のファイル名部分のみを取得するために使用されます。このメソッドは引数を必要とせず、ファイル名を表す文字列を返します。

GlobIteratorは、シェルと同様のパターンマッチング(例: *.txt)を使用して、指定されたパスに一致するファイルやディレクトリを効率的に見つけ出すためのクラスです。GlobIteratorでファイルやディレクトリを反復処理する際、各項目はSplFileInfoオブジェクトとして扱われます。getFilename()メソッドをそのSplFileInfoオブジェクトに対して呼び出すことで、例えば「/var/www/html/index.php」というパスから「index.php」といったファイル名だけを抽出することができます。

提供されたサンプルコードでは、まず一時ディレクトリ内に複数のサンプルファイルを作成します。その後、GlobIteratorを使ってその一時ディレクトリ内のファイルを検索し、反復処理を行います。各ファイルについて、getFilename()メソッドを用いてパス情報を含まない純粋なファイル名を取得し、画面に表示しています。最後に、作成した一時ファイルとディレクトリをクリーンアップして削除する、一連の流れを示しています。これにより、getFilename()がどのように機能するかを具体的に理解できます。

GlobIterator::getFilename()は、指定されたパスのファイル名部分のみを文字列として返します。ディレクトリパスや親ディレクトリの情報は含まれないため、フルパスが必要な場合はgetPathname()メソッドをご利用ください。GlobIteratorのコンストラクタに渡すパターンは、シェルのワイルドカード(*など)と同じように機能しますが、パターンが正しくないと目的のファイルが取得できません。また、ファイルシステムへのアクセスは、ファイルの有無やアクセス権によってエラーが発生する可能性があるため、try-catchブロックを用いた堅牢なエラーハンドリングを実装することが重要です。サンプルコードのように一時ファイルやディレクトリを作成した場合は、必ず後処理として削除し、ディスクをきれいに保つように心がけてください。

関連コンテンツ