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

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

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

作成日: 更新日:

基本的な使い方

getSubPathnameメソッドは、PharDataクラスが扱うアーカイブファイル内の特定のエントリについて、そのパス名の一部を取得するメソッドです。PharDataクラスは、PHPにおいて、.tarや.zip、.pharといったアーカイブファイルを効率的に読み書き・操作するために利用されます。

アーカイブファイルには、複数のファイルやディレクトリが「エントリ」として格納されており、このメソッドの主な役割は、それらのエントリのパスから、基準となるベースディレクトリを除いた部分を文字列として返すことにあります。

具体的には、アーカイブの内容をイテレータ(個々のエントリを順番に処理するための仕組み)で走査している際、各エントリはアーカイブ内での相対的な位置を示すパス情報を持っています。getSubPathnameメソッドは、この相対パスの中から、イテレータが開始したディレクトリ(ベースディレクトリ)よりも下位の階層にある部分のみを抽出して提供します。

例えば、アーカイブ内に「images/thumbnails/sample.jpg」というパスのエントリがあり、もしアーカイブ全体ではなく「images」ディレクトリを基準としてイテレータが走査を開始している場合、このメソッドは「thumbnails/sample.jpg」という結果を返します。

この機能は、アーカイブ内の特定のサブディレクトリ構造に着目してファイルを処理したい場合や、アーカイブのルートからの絶対的なパスではなく、特定の開始点からの相対的なパス情報を把握したい場合に非常に有用です。これにより、アーカイブ内のファイルの場所を柔軟に管理し、目的に応じた処理を行うための基礎情報として活用できます。

構文(syntax)

1<?php
2$pharData = new PharData('path/to/archive.tar');
3$subPathname = $pharData->getSubPathname();
4?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

指定された PharData オブジェクトに格納されているエントリのパス名から、phar:// スキームを除いた部分を文字列として返します。

サンプルコード

PHP PharData getSubPathnameでパス名取得

1<?php
2
3// このスクリプトは、PharDataアーカイブを作成し、ファイルを追加し、
4// そのファイルのエントリからアーカイブ内の相対パス(サブパス)を取得する方法を示します。
5// 実行にはPHPのphar拡張モジュールが有効になっている必要があります。
6
7// 一時的なPharDataアーカイブのファイル名を定義します。
8// .tar形式はPharDataで一般的に使用され、扱いが比較的シンプルです。
9$pharFileName = 'example_archive.tar';
10
11// アーカイブに追加するファイルの名前と内容を定義します。
12// このファイルはアーカイブ内で 'documents/report.txt' というパスで格納されます。
13$fileInArchive = 'documents/report.txt';
14$fileContent = "これはサンプルレポートの内容です。\nPHP PharDataのテスト用ファイル。";
15
16// --- アーカイブの作成とファイル追加 ---
17try {
18    // スクリプトの再実行時に既存のアーカイブが残っている場合を考慮し、先に削除します。
19    if (file_exists($pharFileName)) {
20        echo "既存のアーカイブ '{$pharFileName}' を削除します...\n";
21        PharData::unlinkArchive($pharFileName);
22    }
23
24    echo "PharDataアーカイブ '{$pharFileName}' を作成中...\n";
25
26    // PharDataオブジェクトを新規作成します。
27    // この時点で指定されたファイル名でアーカイブが作成(または上書き)されます。
28    $phar = new PharData($pharFileName);
29
30    // アーカイブにファイルを追加します。
31    // addFromString() メソッドは、指定したパスと内容でアーカイブ内にファイルを作成します。
32    echo "アーカイブにファイル '{$fileInArchive}' を追加中...\n";
33    $phar->addFromString($fileInArchive, $fileContent);
34
35    // アーカイブへの書き込みを完了させ、リソースを解放するためにPharDataオブジェクトをnullにします。
36    // これにより、アーカイブファイルが完全にディスクに書き込まれます。
37    $phar = null;
38    echo "アーカイブ '{$pharFileName}' の作成とファイル追加が完了しました。\n";
39
40    // --- アーカイブからの情報取得 ---
41    echo "\nアーカイブを読み込みモードでオープン中...\n";
42
43    // 読み込みモードで再度PharDataオブジェクトを作成します。
44    // これにより、既存のアーカイブの内容にアクセスできるようになります。
45    $phar = new PharData($pharFileName);
46
47    // アーカイブ内の特定のエントリ(ファイル)を取得します。
48    // 配列のオフセットアクセス($phar['path/to/file'])でPharFileInfoオブジェクトを取得できます。
49    if (isset($phar[$fileInArchive])) {
50        $entry = $phar[$fileInArchive];
51
52        // getSubPathname() メソッドは、アーカイブのルートディレクトリからの相対パスを返します。
53        // これはアーカイブ内のファイルやディレクトリの位置を示します。
54        $subPathname = $entry->getSubPathname();
55
56        echo "アーカイブ内のファイル '{$fileInArchive}' のサブパス名(relativePath)は: '{$subPathname}'\n";
57        // この例では、'documents/report.txt' がそのまま出力されるはずです。
58
59    } else {
60        echo "エラー: アーカイブ内でファイル '{$fileInArchive}' が見つかりませんでした。\n";
61    }
62
63} catch (Exception $e) {
64    // 例外発生時のエラーハンドリング
65    echo "エラーが発生しました: " . $e->getMessage() . "\n";
66    echo "PharDataアーカイブの作成には、書き込み権限とphar拡張モジュールの有効化が必要です。\n";
67    echo "php.ini の phar.readonly が 'Off' に設定されているか確認してください。\n";
68} finally {
69    // --- クリーンアップ ---
70    // 処理が完了したら、作成した一時的なPharDataアーカイブファイルを削除します。
71    if (file_exists($pharFileName)) {
72        echo "\nクリーンアップ中: アーカイブファイル '{$pharFileName}' を削除します...\n";
73        PharData::unlinkArchive($pharFileName);
74        echo "アーカイブファイルが削除されました。\n";
75    }
76}
77
78?>

このサンプルコードは、PHPのPharDataクラスを用いてアーカイブファイル(例: .tar)を作成し、その中にファイルを追加した後、追加されたファイルのエントリからgetSubPathname()メソッドを使ってアーカイブ内の相対パスを取得する方法を、システムエンジニアを目指す初心者の方にもわかりやすく示しています。

PharDataクラスは、複数のファイルを一つのアーカイブファイルにまとめたり、そのアーカイブ内のファイルにアクセスしたりするための機能を提供します。サンプルではまず、example_archive.tarという一時的なアーカイブを新規作成し、documents/report.txtというパスでテキストファイルを追加しています。

ファイルが追加された後、再びアーカイブを読み込みモードで開き、追加したdocuments/report.txtのエントリ(PharFileInfoオブジェクト)を取得します。ここでgetSubPathname()メソッドが登場します。このメソッドは、引数を一切取らず、呼び出されたファイルエントリがアーカイブのルートディレクトリから見てどのような相対パスを持っているかを、文字列として返します。例えば、この例では"documents/report.txt"という文字列が返され、アーカイブ内でのファイルの正確な位置を把握できます。

スクリプトの実行にはPHPのphar拡張モジュールが有効になっている必要があります。また、アーカイブを作成する際は、php.ini設定のphar.readonlyOffになっていることを確認してください。処理の最後に、作成したアーカイブファイルはクリーンアップとして削除されます。

このサンプルコードは、Phar拡張モジュールの有効化が必須です。php.iniでphar.readonlyOffに設定しないと、アーカイブの作成や変更ができませんので、事前に確認してください。getSubPathnameメソッドは、PharDataオブジェクト自体ではなく、アーカイブ内の個々のファイルやディレクトリを表すPharFileInfoオブジェクト(例えば$phar['path/to/file']で取得)から呼び出す点に注意が必要です。戻り値は、アーカイブのルートからの相対パスを表します。アーカイブ操作はファイルシステムに影響を与えるため、try-catchブロックによるエラーハンドリングと、finallyブロックでの作成済みアーカイブの確実なクリーンアップが、安全な運用に不可欠です。

関連コンテンツ