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

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

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

作成日: 更新日:

基本的な使い方

getPathInfoメソッドは、Pharアーカイブ内に含まれるファイルやディレクトリ(エントリと呼びます)の親ディレクトリ情報を取得するために実行されるメソッドです。

Pharアーカイブとは、複数のPHPファイルや関連リソースを一つにまとめるための、PHP独自のアーカイブ形式を指します。PharFileInfoクラスは、このPharアーカイブ内に存在する個々のファイルやディレクトリに関する詳細な情報を提供する役割を担っています。

このgetPathInfoメソッドは、特定のPharアーカイブ内のエントリ、例えば「myarchive.phar/images/icon.png」というパスを持つエントリに対して呼び出されると、「myarchive.phar/images」という親ディレクトリの情報を表すSplFileInfoオブジェクトを返します。SplFileInfoオブジェクトは、ファイルやディレクトリに関する様々な情報(例えばパスや名前など)を提供するPHPの標準的なクラスです。

したがって、getPathInfoメソッドを使用することで、Pharアーカイブ内のファイルがどのディレクトリ構造の中に位置しているかをプログラム的に把握し、そのディレクトリに関するさらに詳しい情報を得ることが可能になります。このメソッドは、Pharアーカイブ内でファイルを操作する際、対象のエントリが属するディレクトリの情報を基準にして、関連する処理を実行したい場合に特に有用です。例えば、同じディレクトリ内に新しいエントリを作成するなどのシナリオで利用できます。

構文(syntax)

1<?php
2$pharFilePath = 'example_archive.phar';
3if (file_exists($pharFilePath)) {
4    unlink($pharFilePath);
5}
6try {
7    $pharArchive = new Phar($pharFilePath);
8    $pharArchive->addFromString('internal/my_document.txt', 'This is a test document.');
9    $fileWithinPharInfo = $pharArchive['internal/my_document.txt'];
10    $pathInfoObject = $fileWithinPharInfo->getPathInfo();
11} finally {
12    if (file_exists($pharFilePath)) {
13        unlink($pharFilePath);
14    }
15}
16?>

引数(parameters)

?string $class = null

  • ?string $class = null: 取得したいパス情報のクラス名を指定します。省略した場合は、すべてのクラス情報が取得されます。

戻り値(return)

SplFileInfo

PharFileInfo::getPathInfo は、現在の Phar アーカイブエントリのパス情報を格納した SplFileInfo オブジェクトを返します。このオブジェクトには、ファイル名、ディレクトリ名、拡張子などの情報が含まれています。

サンプルコード

PharFileInfo::getPathInfo()でパス情報取得

1<?php
2
3/**
4 * PharFileInfo::getPathInfo() メソッドの使用例を示します。
5 * このメソッドは、Pharアーカイブ内のファイルパスに関する情報を提供する
6 * SplFileInfo オブジェクトを返します。
7 *
8 * @param string $pharFileName 作成するPharアーカイブのファイル名
9 * @param string $tempDir Pharに含める一時コンテンツのディレクトリ名
10 */
11function demonstratePharFileInfoGetPathInfo(string $pharFileName = 'example.phar', string $tempDir = 'temp_phar_contents'): void
12{
13    // 一時ディレクトリとPharファイルへのパスを構築
14    $fullTempDirPath = __DIR__ . '/' . $tempDir;
15    $fullPharPath = __DIR__ . '/' . $pharFileName;
16
17    // --- 事前準備: 一時ファイルとディレクトリのクリーンアップ ---
18    if (file_exists($fullPharPath)) {
19        unlink($fullPharPath);
20    }
21    if (file_exists($fullTempDirPath)) {
22        $rii = new RecursiveIteratorIterator(
23            new RecursiveDirectoryIterator($fullTempDirPath, FilesystemIterator::SKIP_DOTS),
24            RecursiveIteratorIterator::CHILD_FIRST
25        );
26        foreach ($rii as $file) {
27            $file->isDir() ? rmdir($file->getPathname()) : unlink($file->getPathname());
28        }
29        rmdir($fullTempDirPath);
30    }
31
32    // --- ステップ1: Pharアーカイブに含める一時コンテンツの作成 ---
33    // サブディレクトリを作成し、ファイルを追加
34    mkdir($fullTempDirPath . '/sub', 0777, true);
35    file_put_contents($fullTempDirPath . '/sub/file1.txt', 'これはサブディレクトリ内のテキストファイルです。');
36    file_put_contents($fullTempDirPath . '/script.php', '<?php echo "Pharから実行されたスクリプトです。";');
37
38    // Pharアーカイブ内のファイルパス
39    $innerFilePath1 = 'sub/file1.txt';
40    $innerFilePath2 = 'script.php';
41
42    try {
43        // --- ステップ2: 新しいPharアーカイブの作成 ---
44        // Pharクラスをインスタンス化し、一時ディレクトリの内容からアーカイブを構築
45        $phar = new Phar($fullPharPath);
46        // アーカイブを読み書き可能モードにし、バッファリングを停止して変更を確定
47        $phar->buildFromDirectory($fullTempDirPath);
48        $phar->stopBuffering();
49
50        echo "Pharアーカイブ '{$fullPharPath}' が作成されました。\n\n";
51
52        // --- ステップ3: Pharアーカイブ内のPharFileInfoオブジェクトにアクセス ---
53        // アーカイブ内の特定のファイルにアクセスし、PharFileInfoオブジェクトを取得
54        if (isset($phar[$innerFilePath1])) {
55            /** @var PharFileInfo $pharFileInfo */
56            $pharFileInfo = $phar[$innerFilePath1];
57
58            echo "--- Pharアーカイブ内のファイル '{$innerFilePath1}' の情報 ---\n";
59
60            // --- ステップ4: getPathInfo() を呼び出して SplFileInfo オブジェクトを取得 ---
61            // getPathInfo() は、ファイルパスに関するより詳細な情報を提供する SplFileInfo オブジェクトを返します。
62            $splFileInfo = $pharFileInfo->getPathInfo();
63
64            echo "元のPharFileInfoパス名: " . $pharFileInfo->getPathname() . "\n";
65            echo "返されたSplFileInfoの型: " . get_class($splFileInfo) . "\n";
66            echo "ファイル名 (SplFileInfoから): " . $splFileInfo->getFilename() . "\n";       // 例: file1.txt
67            echo "拡張子 (SplFileInfoから): " . $splFileInfo->getExtension() . "\n";     // 例: txt
68            echo "基本名 (SplFileInfoから): " . $splFileInfo->getBasename() . "\n";       // 例: file1.txt
69            echo "ディレクトリ名 (SplFileInfoから): " . $splFileInfo->getDirname() . "\n";         // 例: sub
70            echo "フルパス名 (SplFileInfoから): " . $splFileInfo->getPathname() . "\n\n";     // 例: sub/file1.txt (アーカイブルートからの相対パス)
71
72            // 別のファイルの例
73            /** @var PharFileInfo $pharFileInfoScript */
74            $pharFileInfoScript = $phar[$innerFilePath2];
75            $splFileInfoScript = $pharFileInfoScript->getPathInfo();
76
77            echo "--- Pharアーカイブ内のファイル '{$innerFilePath2}' の情報 ---\n";
78            echo "元のPharFileInfoパス名: " . $pharFileInfoScript->getPathname() . "\n";
79            echo "ファイル名 (SplFileInfoから): " . $splFileInfoScript->getFilename() . "\n";
80            echo "拡張子 (SplFileInfoから): " . $splFileInfoScript->getExtension() . "\n";
81            echo "基本名 (SplFileInfoから): " . $splFileInfoScript->getBasename() . "\n";
82            echo "ディレクトリ名 (SplFileInfoから): " . $splFileInfoScript->getDirname() . "\n";
83            echo "フルパス名 (SplFileInfoから): " . $splFileInfoScript->getPathname() . "\n";
84
85        } else {
86            echo "ファイル '{$innerFilePath1}' がPharアーカイブ内で見つかりませんでした。\n";
87        }
88
89    } catch (PharException $e) {
90        echo "Pharエラー: " . $e->getMessage() . "\n";
91    } catch (Exception $e) {
92        echo "一般エラー: " . $e->getMessage() . "\n";
93    } finally {
94        // --- 後処理: 一時Pharアーカイブとディレクトリのクリーンアップ ---
95        if (file_exists($fullPharPath)) {
96            unlink($fullPharPath);
97            echo "\n一時ファイル '{$fullPharPath}' をクリーンアップしました。\n";
98        }
99        if (file_exists($fullTempDirPath)) {
100            $rii = new RecursiveIteratorIterator(
101                new RecursiveDirectoryIterator($fullTempDirPath, FilesystemIterator::SKIP_DOTS),
102                RecursiveIteratorIterator::CHILD_FIRST
103            );
104            foreach ($rii as $file) {
105                $file->isDir() ? rmdir($file->getPathname()) : unlink($file->getPathname());
106            }
107            rmdir($fullTempDirPath);
108            echo "一時ディレクトリ '{$fullTempDirPath}' をクリーンアップしました。\n";
109        }
110    }
111}
112
113// サンプルコードを実行
114demonstratePharFileInfoGetPathInfo();
115

PharFileInfo::getPathInfo()メソッドは、Pharアーカイブ(複数のPHPファイルを一つにまとめた実行可能なファイル形式)に格納された、個々のファイルに関する詳細なパス情報を取得するために使用されます。このメソッドは、Pharアーカイブ内の特定のファイルを表現するPharFileInfoオブジェクトから呼び出されます。

引数$classはオプションであり、通常は指定する必要はありません。このメソッドを呼び出すと、戻り値としてSplFileInfoオブジェクトが返されます。このSplFileInfoオブジェクトは、ファイルのパスに関する多様な情報を提供します。具体的には、getFilename()メソッドでファイル名、getExtension()メソッドで拡張子、getDirname()メソッドでファイルが属するディレクトリ名、そしてgetPathname()メソッドでPharアーカイブのルートからの相対パスなどを取得できます。

これにより、Pharアーカイブ内のファイルの構造をプログラムで容易に解析し、ファイル名やディレクトリに基づいて処理を行うことが可能になります。システムエンジニアを目指す上で、Pharのようなアーカイブ形式の内部ファイルを効率的に操作する際に役立つ機能です。

PharFileInfo::getPathInfo()は、単一ファイルにパッケージ化されたPharアーカイブ内のファイルパスに関する情報を提供します。このメソッドは、ファイルシステム情報を取り扱う汎用的なクラスであるSplFileInfoのオブジェクトを返しますので、そのメソッド群(getFilename()、getExtension()など)を利用して詳細な情報を取得できます。 最も注意すべき点は、PHPに同名のグローバル関数pathinfo()がありますが、それとは全く異なり、Pharアーカイブ内の仮想パスを扱う点です。返されるパス情報はPharアーカイブのルートを基準とした相対パスであり、実際のファイルシステム上の絶対パスではないことを理解してください。

PharFileInfo::getPathInfo() でパス情報を取得する

1<?php
2
3/**
4 * Pharアーカイブ内のファイルのパス情報を取得し、表示する。
5 *
6 * この関数は、一時的なPharアーカイブを作成し、そのアーカイブ内のファイルの
7 * PharFileInfoオブジェクトからgetPathInfo()メソッドを使用して
8 * SplFileInfoオブジェクトを取得し、様々なパス情報を表示します。
9 *
10 * このコードを実行するには、PHPの設定ファイル (php.ini) で
11 * 'phar.readonly' を '0' に設定し、Pharアーカイブの書き込みを許可する必要があります。
12 * 例: phar.readonly = 0
13 *
14 * @param string $archiveName 作成するPharアーカイブの名前。
15 * @param string $fileName Pharアーカイブ内に含めるファイルの名前。
16 * @return void
17 */
18function demonstratePharGetPathInfo(string $archiveName = 'test.phar', string $fileName = 'example.txt'): void
19{
20    // 1. 一時ディレクトリとテストファイルを作成
21    $tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . uniqid('phar_test_');
22    if (!mkdir($tempDir) && !is_dir($tempDir)) {
23        echo "エラー: 一時ディレクトリの作成に失敗しました: {$tempDir}\n";
24        return;
25    }
26    $filePathInDir = $tempDir . DIRECTORY_SEPARATOR . $fileName;
27    file_put_contents($filePathInDir, "このファイルはPharアーカイブ内に含まれます。");
28
29    $pharFilePath = $tempDir . DIRECTORY_SEPARATOR . $archiveName;
30
31    try {
32        // 2. Pharアーカイブを構築 (一時ファイルから)
33        // 'phar.readonly = 0' が設定されていることを前提とします。
34        $phar = new Phar($pharFilePath);
35        // アーカイブに追加するファイルを指定します。第二引数はPharアーカイブ内でのパス名です。
36        $phar->addFile($filePathInDir, $fileName);
37        // デフォルトのスタブ(Pharを実行可能にするためのコード)を設定します。
38        $phar->setStub($phar->createDefaultStub($fileName));
39        // 書き込み操作を確定し、Pharアーカイブを閉じます。
40        $phar->stopBuffering();
41
42        echo "Pharアーカイブが作成されました: " . $pharFilePath . "\n";
43
44        // 3. 作成したPharアーカイブを読み込み
45        // Pharアーカイブを扱うためには、Pharインスタンスを作成して開きます。
46        $phar = new Phar($pharFilePath);
47
48        // 4. Pharアーカイブ内のファイル情報 (PharFileInfo) を取得
49        // キーはPharアーカイブ内での相対パス名です。
50        if (!isset($phar[$fileName])) {
51            echo "エラー: Pharアーカイブ内にファイル '{$fileName}' が見つかりませんでした。\n";
52            return;
53        }
54        $pharFileInfo = $phar[$fileName];
55
56        // 5. getPathInfo() メソッドを呼び出し、SplFileInfo オブジェクトを取得
57        // 引数 $class はオプションで、SplFileInfoの特定のサブクラスを返す場合に利用しますが、
58        // 通常は省略し、デフォルト (SplFileInfo) のインスタンスを取得します。
59        $splFileInfo = $pharFileInfo->getPathInfo();
60
61        echo "\n--- PharFileInfo::getPathInfo() の結果 ---\n";
62
63        // 6. 取得した SplFileInfo オブジェクトから様々なパス情報を取得し表示
64        echo "ファイル名 (getName): " . $splFileInfo->getName() . "\n";
65        // キーワード「php getpathname」に最も関連する情報です。
66        // ファイルのパスとファイル名を結合した文字列を返します。
67        echo "パス名 (getPathname): " . $splFileInfo->getPathname() . "\n";
68        echo "ディレクトリ名 (getPath): " . $splFileInfo->getPath() . "\n";
69        // Pharアーカイブ内部のファイルの場合、getRealPath() はPharアーカイブ内でのパスを返します。
70        echo "フルパス (getRealPath): " . $splFileInfo->getRealPath() . "\n";
71
72    } catch (Exception $e) {
73        echo "エラーが発生しました: " . $e->getMessage() . "\n";
74        // 'phar.readonly' 設定に関連するエラーの場合、その旨をヒントとして表示します。
75        if (str_contains($e->getMessage(), 'phar.readonly INI setting')) {
76            echo "ヒント: このエラーは、php.ini で 'phar.readonly = 0' が設定されていない場合に発生します。\n";
77        }
78    } finally {
79        // 7. 後処理: 作成したPharアーカイブと一時ファイルを削除
80        if (file_exists($pharFilePath)) {
81            // Phar::unlinkArchive() を使用して、安全にPharアーカイブを削除します。
82            // これにより、アーカイブがメモリにマップされている場合でも適切に解除されます。
83            Phar::unlinkArchive($pharFilePath);
84            echo "Pharアーカイブが削除されました: " . $pharFilePath . "\n";
85        }
86        if (file_exists($filePathInDir)) {
87            unlink($filePathInDir);
88        }
89        if (is_dir($tempDir)) {
90            // ディレクトリが空でないと rmdir は失敗するため、
91            // ファイルを削除した後に呼び出します。
92            rmdir($tempDir);
93        }
94        echo "一時ディレクトリが削除されました: " . $tempDir . "\n";
95    }
96}
97
98// サンプル関数の実行
99demonstratePharGetPathInfo();
100
101?>

PharFileInfo::getPathInfo()は、PHPのPharアーカイブ(複数のファイルを一つにまとめたアーカイブ形式)内に含まれる特定のファイルについて、そのパスに関する詳細な情報を取得するメソッドです。

このメソッドを呼び出すと、ファイルのパス、ファイル名、ディレクトリ名などを統一的に扱えるSplFileInfoオブジェクトが戻り値として返されます。特に、キーワードにもあるように、SplFileInfo::getPathname()メソッドを使用することで、Pharアーカイブ内でのファイルの相対的なパス名を含む完全なパス情報を取得できます。

引数$classはオプションで、SplFileInfoの特定のサブクラスのインスタンスを返したい場合に指定しますが、通常は省略され、標準のSplFileInfoオブジェクトが返されます。

サンプルコードでは、まず一時的なPharアーカイブを作成し、その中にテストファイルを追加しています。その後、アーカイブ内のファイルを示すPharFileInfoオブジェクトを取得し、getPathInfo()メソッドを呼び出してSplFileInfoオブジェクトを取り出しています。このSplFileInfoオブジェクトを通じて、Pharアーカイブ内部のファイルが持つパス関連の情報を取得し、表示しています。Pharアーカイブの書き込みには、PHPの設定ファイル(php.ini)でphar.readonly = 0と設定する必要があります。このメソッドは、Pharアーカイブ内のファイルを通常のファイルシステム上のファイルと同じように扱いたい場合に非常に便利です。

このサンプルコードを実行するには、PHPの設定ファイル(php.ini)でphar.readonly = 0と設定し、Pharアーカイブへの書き込みを許可する必要があります。この設定がないと、アーカイブ作成時にエラーが発生しますのでご注意ください。

また、一時的にPharアーカイブやテストファイルを作成する際には、コードのfinallyブロックのように、処理の完了後に必ずPhar::unlinkArchive()やunlink()、rmdir()といった関数を使用して、作成したリソースを適切に削除することが重要です。これにより、不要なファイルが残り続けることによるディスク容量の圧迫や、セキュリティ上の問題を未然に防ぐことができます。

PharFileInfo::getPathInfo()メソッドは、ファイルパスの詳細情報を提供するSplFileInfoオブジェクトを返します。このオブジェクトからは、getName()、getPathname()、getPath()など、様々な形式のパス情報を取得できます。メソッドの引数$classは、通常は省略しても問題ありません。

関連コンテンツ

関連IT用語

関連プログラミング言語