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

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

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

作成日: 更新日:

基本的な使い方

getRealPathメソッドは、GlobIteratorオブジェクトが現在指し示しているファイルやディレクトリの実パスを取得するメソッドです。この「実パス」とは、シンボリックリンクや相対パスを解決し、ファイルシステム上で実際にそのファイルやディレクトリが存在する場所を示す、正規化された絶対パスのことを指します。

GlobIteratorは、指定したパターンに合致するファイルやディレクトリを繰り返し処理する際に使用されます。しかし、その際に取得されるパスがシンボリックリンク経由であったり、../のような相対指定を含む場合、そのままではファイルの実体に基づいた処理を行う際に混乱を招く可能性があります。getRealPathメソッドを用いることで、そのような間接的なパスではなく、常にファイルシステム上の確かな位置を示すパスを確実に取得できます。

このメソッドは、実パスを文字列として返しますが、もし対象のファイルやディレクトリが存在しない場合や、実パスの解決に失敗した場合にはfalseを返します。ファイルのコピーや移動、あるいは絶対パスが必要な他のシステム連携処理など、ファイルの実体に対する正確なパスが必要な状況で非常に役立ちます。

構文(syntax)

1<?php
2
3// 指定されたパターンにマッチするファイルやディレクトリを反復処理するGlobIteratorを作成します。
4// 例として、現在のディレクトリ内のすべてのPHPファイル(*.php)を検索します。
5$iterator = new GlobIterator('*.php');
6
7// イテレータをループし、各要素(SplFileInfoオブジェクト)に対して操作を行います。
8foreach ($iterator as $fileInfo) {
9    // 現在のファイルまたはディレクトリの、シンボリックリンクを解決した完全なパスを取得します。
10    // このメソッドは、SplFileInfoオブジェクトに対して呼び出されます。
11    echo $fileInfo->getRealPath() . PHP_EOL;
12}
13
14?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string|false

GlobIterator::getRealPath メソッドは、イテレータが指すエントリの絶対パスを文字列で返します。指定されたパスが存在しない場合や、アクセス権がない場合は false を返します。

サンプルコード

GlobIterator::getRealPath()でLaravelログの絶対パスを取得する

1<?php
2
3/**
4 * GlobIterator::getRealPath() メソッドの使用例。
5 * Laravelプロジェクトのログファイル検索を想定したシナリオで絶対パスを取得します。
6 *
7 * @return void
8 */
9function demonstrateGlobIteratorGetRealPath(): void
10{
11    // --- テスト環境のセットアップ ---
12    // 一時的なディレクトリをシステムの一時ディレクトリ内に作成します。
13    // uniqid() を使用して、ユニークなディレクトリ名を生成し、他のファイルとの衝突を避けます。
14    $tempDir = sys_get_temp_dir() . '/php_glob_iterator_test_' . uniqid();
15    $storageLogsDir = $tempDir . '/storage/logs';
16
17    // 例としてLaravelプロジェクトの一部を模倣したディレクトリ構造を作成します。
18    // mkdir($storageLogsDir, 0777, true) の最後の引数 'true' は、親ディレクトリも再帰的に作成することを示します。
19    if (!is_dir($storageLogsDir)) {
20        mkdir($storageLogsDir, 0777, true);
21    }
22
23    // テスト用のログファイルを作成します。
24    file_put_contents($storageLogsDir . '/laravel-2023-10-27.log', 'Log entry 1');
25    file_put_contents($storageLogsDir . '/another-log.log', 'Log entry 2');
26    // 検索対象外のファイルも作成しておきます。
27    file_put_contents($tempDir . '/.env', 'APP_ENV=local');
28
29    echo "--- GlobIterator::getRealPath() の使用例 ---" . PHP_EOL;
30    echo "検索対象パス: " . $storageLogsDir . "/*.log" . PHP_EOL;
31    echo "----------------------------------------" . PHP_EOL;
32
33    try {
34        // GlobIterator を使用して、'storage/logs' ディレクトリ内の '.log' ファイルを検索します。
35        // GlobIterator は、指定されたパターン(ここでは "*.log")に一致するファイルやディレクトリをイテレートします。
36        $iterator = new \GlobIterator($storageLogsDir . '/*.log');
37
38        if (!$iterator->count()) {
39            echo "指定されたパターンに一致するファイルは見つかりませんでした。" . PHP_EOL;
40            return;
41        }
42
43        foreach ($iterator as $fileInfo) {
44            // SplFileInfo オブジェクトからファイルの絶対パスを取得します。
45            // getRealPath() メソッドは、ファイルの実際の絶対パス(シンボリックリンクを解決したパス)を返します。
46            // ファイルが存在しない場合や、何らかの問題でパスが取得できない場合は false を返す可能性があります。
47            // そのため、戻り値が false でないことを確認することが重要です。
48            $realPath = $fileInfo->getRealPath();
49
50            if ($realPath !== false) {
51                echo "ファイル名: " . $fileInfo->getFilename() . PHP_EOL;
52                echo "絶対パス (getRealPath): " . $realPath . PHP_EOL;
53                echo "----------------------------------------" . PHP_EOL;
54            } else {
55                echo "ファイル: " . $fileInfo->getFilename() . " の絶対パスの取得に失敗しました。" . PHP_EOL;
56            }
57        }
58    } catch (\Exception $e) {
59        // エラーが発生した場合は、そのメッセージを出力します。
60        echo "エラーが発生しました: " . $e->getMessage() . PHP_EOL;
61    } finally {
62        // --- テスト環境のクリーンアップ ---
63        // 作成した一時ディレクトリとファイルを削除し、環境をきれいにします。
64        if (is_dir($tempDir)) {
65            // RecursiveIteratorIterator と RecursiveDirectoryIterator を使用して、
66            // ディレクトリとその中の全てのファイル・サブディレクトリを再帰的に走査します。
67            $files = new \RecursiveIteratorIterator(
68                new \RecursiveDirectoryIterator($tempDir, \RecursiveDirectoryIterator::SKIP_DOTS),
69                \RecursiveIteratorIterator::CHILD_FIRST // 子要素から削除するために重要です。
70            );
71
72            foreach ($files as $fileinfo) {
73                // ファイルかディレクトリかによって削除方法を切り替えます。
74                $todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
75                $todo($fileinfo->getRealPath());
76            }
77
78            // ルートの一時ディレクトリを削除します。
79            rmdir($tempDir);
80        }
81        echo "テスト環境をクリーンアップしました。" . PHP_EOL;
82    }
83}
84
85// 関数を実行して、GlobIterator::getRealPath() の動作を確認します。
86demonstrateGlobIteratorGetRealPath();

GlobIterator::getRealPath() メソッドは、PHPの標準拡張機能であるGlobIteratorクラスに属するメソッドです。このメソッドは、GlobIteratorがパターンマッチングで見つけたファイルやディレクトリの、実際の絶対パスを取得するために使用されます。特に、シンボリックリンクが存在する場合でも、そのリンクが指し示す物理的なファイルの絶対パスを解決して返してくれる点が特徴です。

このメソッドに引数はなく、GlobIteratorで取得したファイル情報オブジェクト(SplFileInfo)から呼び出すだけで対象のパスを返します。戻り値は、パスの取得に成功した場合は文字列(ファイルの絶対パス)を返しますが、ファイルが存在しない場合や何らかの問題でパスが取得できなかった場合は false を返します。そのため、戻り値が false でないことを確認する処理を挟むことが重要です。

サンプルコードでは、Laravelプロジェクトのログファイル検索を想定し、storage/logsディレクトリ内の.logファイルを見つけ、その実際の絶対パスを具体的に取得する例を示しています。システムのファイルやディレクトリを扱う際に、正確なパス情報を得るために役立つメソッドです。

getRealPath()はファイルの実際の絶対パス(シンボリックリンクを解決したパス)を返しますが、ファイルが存在しない場合や何らかの問題でパスが取得できない場合はfalseを返します。そのため、必ず戻り値がfalseでないことを確認し、適切に処理を分岐させてください。ファイル検索処理中にエラーが発生する可能性もあるため、try-catchブロックで囲むことで、予期せぬ挙動を防ぎ安全性を高められます。また、サンプルコードのように一時的なファイルやディレクトリを作成した場合は、finallyブロックを利用して確実にクリーンアップを行い、システムに不要なリソースを残さないことが重要です。このメソッドはPHPの標準的な機能であり、Laravelプロジェクトのファイル操作でも同様に活用できます。

関連コンテンツ

関連IT用語

関連プログラミング言語