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

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

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

作成日: 更新日:

基本的な使い方

currentメソッドは、PHPのPharアーカイブが現在指し示しているファイルやディレクトリのエントリを取得するメソッドです。Phar(PHPアーカイブ)は、複数のPHPファイルやその他のリソースを一つのアーカイブファイルにまとめ、PHPアプリケーション全体やそのライブラリを単一のファイルとして配布・実行可能にするための特殊な形式です。

このメソッドは、Pharクラスが実装するIteratorインターフェースの一部として機能し、Pharアーカイブ内のエントリをループ処理する際に非常に重要です。例えば、foreachループを使用してアーカイブ内の各ファイルやディレクトリを順に処理する場合、ループの現在のステップでアクセスしているエントリの具体的な情報を取得するためにcurrentメソッドが呼び出されます。

戻り値は、通常、現在のエントリに関する詳細な情報を提供するPharFileInfoクラスのインスタンスです。このPharFileInfoオブジェクトからは、エントリのファイル名、サイズ、パーミッション、最終更新時刻といった詳細な情報を取り出すことができます。これにより、アーカイブ内の各エントリに対して特定の操作を行ったり、その内容を検査したりすることが可能になります。Pharアーカイブの内容を効率的に探索し、管理するために不可欠なメソッドです。

構文(syntax)

1<?php
2$pharPath = __DIR__ . '/_temp_archive.phar';
3if (file_exists($pharPath)) {
4    unlink($pharPath);
5}
6$phar = new Phar($pharPath);
7$phar->addFromString('file_a.txt', 'Content A');
8$phar->stopBuffering();
9
10$pharIterator = new Phar($pharPath);
11$pharIterator->rewind();
12$currentEntry = $pharIterator->current();
13
14if ($currentEntry instanceof PharFileInfo) {
15    $filename = $currentEntry->getFilename();
16}
17
18if (file_exists($pharPath)) {
19    unlink($pharPath);
20}
21?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

PharFileInfo|false

Phar::current() は、現在のエントリを表す PharFileInfo オブジェクト、またはリストの終端に達した場合は false を返します。

サンプルコード

PHP Phar::current でアーカイブを探索する

1<?php
2
3/**
4 * Pharアーカイブを作成し、その内容をPhar::current()メソッドで探索するデモンストレーション。
5 *
6 * この関数は一時的なPharアーカイブファイルを作成し、いくつかのファイルを追加します。
7 * その後、Phar::current()メソッド(foreachループ内で暗黙的に呼び出される)を使用して
8 * アーカイブ内の各エントリにアクセスし、特に「version.txt」ファイルの内容を表示することで、
9 * キーワード「php current stable version」に関連するデモを提供します。
10 *
11 * @return void
12 */
13function demonstratePharCurrent(): void
14{
15    // 一時的なPharファイル名とパスを定義します。
16    // スクリプトがあるディレクトリに作成されます。
17    $pharPath = __DIR__ . '/my_application_demo.phar';
18    $versionFileName = 'version.txt';
19    // キーワード「php current stable version」に関連するバージョン情報文字列。
20    $stableVersionContent = 'PHP 8.2.0 (current stable version)';
21
22    try {
23        // スクリプトを複数回実行する際に問題が起きないよう、既存のPharファイルがあれば削除します。
24        // Phar::unlinkArchive() は、Pharファイルとそれに付随する`.sig`ファイルなどを安全に削除します。
25        if (file_exists($pharPath)) {
26            Phar::unlinkArchive($pharPath);
27        }
28
29        // 新しいPharアーカイブを書き込みモードで作成します。
30        // 第1引数: Pharファイルのパス
31        // 第2引数: フラグ (0はデフォルト)
32        // 第3引数: このPharを識別するためのエイリアス
33        $phar = new Phar($pharPath, 0, 'my_app.phar');
34
35        // Pharアーカイブのスタブ(実行開始時のコード)を設定します。
36        // これはPharファイルをPHPスクリプトとして直接実行したときに最初に実行される部分です。
37        $phar->setStub($phar->createDefaultStub('index.php'));
38
39        // ファイル追加の効率化のためにバッファリングを開始します。
40        // これにより、複数のファイルを追加する際にパフォーマンスが向上します。
41        $phar->startBuffering();
42
43        // アーカイブにファイルを追加します。
44        // addFromString(string $localName, string $contents)
45        $phar->addFromString('index.php', '<?php echo "Hello from Phar!";');
46        $phar->addFromString($versionFileName, $stableVersionContent); // バージョン情報ファイルを追加
47        $phar->addFromString('config.ini', '[app]\nname="Demo App"\n');
48
49        // バッファリングを停止し、変更をPharファイルに書き込みます。
50        $phar->stopBuffering();
51
52        echo "Pharアーカイブが作成されました: " . realpath($pharPath) . "\n\n";
53
54        // 作成したPharアーカイブを読み込みモードで開きます。
55        // Phar::current()メソッドは、Pharオブジェクトがイテレータとして使用される際に、
56        // 現在の要素(ファイルまたはディレクトリ)のPharFileInfoオブジェクトを返します。
57        $pharReader = new Phar($pharPath);
58
59        echo "Pharアーカイブの内容をPhar::current()メソッドで探索します:\n";
60        // Pharオブジェクトはイテレータとして機能するため、foreachループで直接処理できます。
61        // ループの各反復で、$fileInfo変数はPhar::current()が返すPharFileInfoオブジェクトになります。
62        foreach ($pharReader as $name => $fileInfo) {
63            /**
64             * @var PharFileInfo $fileInfo Phar::current()メソッドが返すオブジェクトと同じ型。
65             *                           現在のイテレータ位置のファイル情報を保持します。
66             */
67            // 現在のファイル名を取得します。
68            $currentFileName = $fileInfo->getFilename();
69
70            echo "- ファイル名: " . $currentFileName . "\n";
71
72            // もし現在のエントリがバージョン情報ファイルなら、その内容を表示します。
73            if ($currentFileName === $versionFileName) {
74                echo "  -> " . $versionFileName . " を発見!現在の安定版バージョン情報: " . $fileInfo->getContents() . "\n";
75            } else {
76                // その他のファイルの内容の一部を表示します(ファイルが非常に大きい場合を考慮)。
77                $contentPreview = substr($fileInfo->getContents(), 0, 50);
78                echo "  -> 内容プレビュー: " . $contentPreview . (strlen($fileInfo->getContents()) > 50 ? "..." : "") . "\n";
79            }
80        }
81
82        echo "\nPharアーカイブの探索が完了しました。\n";
83
84    } catch (Exception $e) {
85        // Phar操作中に発生した例外を捕捉し、エラーメッセージを表示します。
86        echo "エラーが発生しました: " . $e->getMessage() . "\n";
87    } finally {
88        // スクリプト終了時に、作成した一時Pharファイルを必ず削除します。
89        if (file_exists($pharPath)) {
90            Phar::unlinkArchive($pharPath);
91            echo "一時Pharファイルが削除されました: " . realpath($pharPath) . "\n";
92        }
93    }
94}
95
96// デモンストレーション関数を実行します。
97demonstratePharCurrent();

PHPのPhar::currentメソッドは、複数のファイルを一つにまとめた「Pharアーカイブ」の中から、現在処理しているファイルの情報を取り出す際に使われます。このメソッドに引数はなく、現在位置のファイル詳細を含むPharFileInfoオブジェクトを返しますが、もし処理中に問題があった場合はfalseが戻り値となります。通常、foreachループでPharアーカイブ内のファイルを順に処理する際、このメソッドが自動的に呼び出され、各ファイルの情報を提供します。

提供されたサンプルコードでは、まず一時的なPharアーカイブを作成し、「PHPの現在の安定版バージョン情報」を持つ「version.txt」ファイルなど、いくつかのファイルをアーカイブに格納しています。そして、このアーカイブをforeachループで探索し、Phar::currentメソッドから得られるPharFileInfoオブジェクトを使って、各ファイルの名称とその内容を表示しています。特に「version.txt」を発見した際には、その中に書かれたバージョン情報を具体的に出力することで、Pharアーカイブ内のファイル内容を効率的に確認する方法をデモンストレーションしています。

このサンプルコードは、PHPのPhar::current()メソッドの利用方法を示していますが、このメソッドは通常、Pharオブジェクトをforeachループでイテレートする際に暗黙的に呼び出されます。そのため、直接呼び出す機会は少ないことを理解しておきましょう。Phar::current()は、イテレータの現在の位置にある要素を表すPharFileInfoオブジェクトを返しますので、その情報を使ってファイル名や内容にアクセスします。Pharアーカイブの作成には、php.iniphar.readonly0に設定する必要がある点、また、セキュリティ上の理由から信頼できないPharファイルは開かないように注意してください。サンプルコードのように、一時的に作成したPharファイルは必ずfinallyブロックで削除するなど、適切な後処理を行うことが重要です。

PHP 8 Phar::current()メソッドでアーカイブを操作する

1<?php
2
3/**
4 * Pharアーカイブを操作し、Phar::current()メソッドの動作を示すサンプルコードです。
5 * システムエンジニアを目指す初心者向けに、Pharファイルの作成から内容の読み取り、
6 * そしてクリーンアップまでの一連の流れを簡潔に示します。
7 *
8 * キーワード: php current version 2025
9 * - 'php': PHP 8環境での実行を想定しています。
10 * - 'current': Phar::current()メソッドの動作を中心に示します。
11 * - 'version': Pharファイル内にバージョン情報を含むダミーファイルを作成し、その内容を参照する形で関連付けます。
12 * - '2025': このコードが将来のプロジェクトでも役立つような基本的なPhar操作を示唆します。
13 *
14 * @return void
15 */
16function demonstratePharCurrentMethod(): void
17{
18    // 一時的なPharファイルの名前を定義
19    $pharFileName = 'my_app_archive.phar';
20    // Pharファイルに含めるダミーファイルのためのディレクトリパスを定義
21    $pharContentsDir = __DIR__ . '/_phar_contents';
22
23    echo "--- Phar::current() メソッドのデモンストレーション (PHP 8) ---\n\n";
24    echo "このコードはPharファイルを生成し、その内容を読み取ります。\n";
25    echo "Pharファイルの作成には、php.iniで 'phar.readonly=0' の設定が必要な場合があります。\n\n";
26
27    try {
28        // --- 1. Pharアーカイブの準備 (作成と内容追加) ---
29        echo "1. Pharアーカイブの準備中...\n";
30
31        // 既存のPharファイルを削除(もし同じ名前のファイルが残っていた場合)
32        if (file_exists($pharFileName)) {
33            unlink($pharFileName);
34        }
35
36        // Pharに含める内容のためのディレクトリを作成
37        if (!is_dir($pharContentsDir)) {
38            mkdir($pharContentsDir);
39        }
40
41        // ダミーファイルを作成し、Pharアーカイブに含める内容を用意
42        file_put_contents($pharContentsDir . '/file1.txt', 'これは最初のダミーファイルです。');
43        // 'version' キーワードに関連するダミーファイルを作成
44        file_put_contents($pharContentsDir . '/version_info.txt', 'アプリケーションバージョン: 1.0 (PHP 8, 2025年対応版)');
45        file_put_contents($pharContentsDir . '/config.ini', '[settings]' . PHP_EOL . 'debug=true');
46
47        // Pharアーカイブを作成するためのPharオブジェクトをインスタンス化
48        // コンストラクタで、新しいアーカイブファイルのパスを指定します。
49        $phar = new Phar($pharFileName);
50
51        // デフォルトのStub(起動コード)を設定。これによりPharを直接実行可能にします。
52        $phar->setStub($phar->createDefaultStub('index.php', 'index.php'));
53
54        // 指定したディレクトリ内のファイルをすべてPharアーカイブに追加します。
55        $phar->buildFromDirectory($pharContentsDir);
56
57        echo "Pharファイル '" . $pharFileName . "' が正常に作成されました。\n\n";
58
59        // --- 2. Phar::current() メソッドの動作確認 ---
60        echo "2. Phar::current() メソッドの動作確認...\n";
61
62        // 作成したPharファイルを読み込みモードで開くためのPharオブジェクトをインスタンス化
63        // このオブジェクトはイテレータのようにPharアーカイブ内のファイルを巡回できます。
64        $pharReader = new Phar($pharFileName);
65
66        // イテレータを最初の要素に巻き戻します。
67        // これにより、Phar::current() がアーカイブ内の最初のファイルエントリを指すようになります。
68        $pharReader->rewind();
69        echo "  イテレータを最初の要素に巻き戻しました。\n";
70
71        // イテレータが有効な位置にあるか(要素が存在するか)確認
72        if ($pharReader->valid()) {
73            // Phar::current() を呼び出して、現在のイテレータ位置にある要素(PharFileInfoオブジェクト)を取得します。
74            // このメソッドは、現在のファイルのメタデータ(ファイル名、サイズなど)を含むオブジェクトを返します。
75            $fileInfo = $pharReader->current(); // 戻り値の型は PharFileInfo|false
76
77            echo "  [現在の要素 (1番目)] ファイル名: " . $fileInfo->getFilename() . "\n";
78            echo "  ファイルサイズ: " . $fileInfo->getSize() . " バイト\n";
79
80            // 'version' キーワードに関連付けて、version_info.txtの内容を読み取る例
81            if ($fileInfo->getFilename() === 'version_info.txt') {
82                echo "  ファイル内容: " . file_get_contents($fileInfo->getPathname()) . "\n";
83            }
84        } else {
85            echo "  Pharファイルが空か、現在の位置に有効な要素がありません。\n";
86        }
87
88        // イテレータを次の要素に進めます。
89        $pharReader->next();
90        echo "\n  イテレータを次の要素に進めました。\n";
91
92        // 次の要素が有効な位置にあるか確認
93        if ($pharReader->valid()) {
94            // 再び Phar::current() を呼び出して、現在の要素(2番目のファイル)を取得します。
95            $fileInfo = $pharReader->current(); // 戻り値の型は PharFileInfo|false
96
97            echo "  [現在の要素 (2番目)] ファイル名: " . $fileInfo->getFilename() . "\n";
98            echo "  ファイルサイズ: " . $fileInfo->getSize() . " バイト\n";
99        } else {
100            echo "  これ以上有効な要素はありません。\n";
101        }
102
103        echo "\nPhar::current() メソッドのデモンストレーションが完了しました。\n\n";
104
105    } catch (PharException $e) {
106        // Phar関連の例外をキャッチし、初心者に分かりやすいメッセージで表示します。
107        echo "エラーが発生しました: " . $e->getMessage() . "\n";
108        echo "Pharの作成や操作には、'phar.readonly=0' の設定がphp.iniで必要になる場合があります。\n";
109        return; // エラーが発生した場合はクリーンアップせずに終了
110    } finally {
111        // --- 3. クリーンアップ ---
112        echo "3. クリーンアップ中...\n";
113
114        // 作成したPharファイルを削除
115        if (file_exists($pharFileName)) {
116            unlink($pharFileName);
117            echo "Pharファイル '" . $pharFileName . "' を削除しました。\n";
118        }
119
120        // Pharコンテンツを格納した一時ディレクトリを削除
121        if (is_dir($pharContentsDir)) {
122            // ディレクトリ内のファイルをすべて削除
123            $files = array_diff(scandir($pharContentsDir), array('.', '..'));
124            foreach ($files as $file) {
125                unlink($pharContentsDir . '/' . $file);
126            }
127            // 空になったディレクトリを削除
128            rmdir($pharContentsDir);
129            echo "Pharコンテンツディレクトリ '" . $pharContentsDir . "' を削除しました。\n";
130        }
131    }
132}
133
134// デモンストレーション関数の実行
135demonstratePharCurrentMethod();
136
137?>

PHPのPharは、複数のPHPスクリプトや関連ファイルを単一のアーカイブファイルにまとめる機能で、アプリケーションの配布やデプロイを効率化するために利用されます。Phar::current()メソッドは、このPharアーカイブ内のファイル(エントリ)をイテレータのように巡回する際に、現在イテレータが指しているファイルの詳細情報(メタデータ)を取得するために使用されます。

このメソッドは引数を必要とせず、現在の位置に有効なファイルエントリが存在する場合はPharFileInfoオブジェクトを、そうでない場合はfalseを戻り値として返します。PharFileInfoオブジェクトからは、ファイル名、サイズ、更新日時などの情報を取得できます。

サンプルコードでは、まず複数のダミーファイルを含むPharアーカイブを作成しています。その後、作成したPharファイルを読み込みモードで開き、rewind()でイテレータをアーカイブの先頭に戻してからPhar::current()を呼び出し、最初のファイル(エントリ)の情報を取得しています。さらにnext()でイテレータを次の要素に進めた後、再びPhar::current()を呼び出して二番目のファイルの情報を取得する様子が示されています。これにより、Pharアーカイブの中身を一つずつ確認し、例えばバージョン情報が記述された特定のファイルを識別して内容を読み取るといった操作が可能になります。

Pharファイルを作成・変更する際は、PHPの設定ファイル(php.ini)でphar.readonly0に設定する必要があります。Phar::current()メソッドは、Pharオブジェクトが持つ内部イテレータの現在の位置にあるファイル情報(PharFileInfoオブジェクト)を返します。このため、目的のファイルにアクセスするには、事前にrewind()でイテレータを先頭に戻したり、next()で次に進めたりする操作が不可欠です。有効な要素がない場合、このメソッドはfalseを返すため、戻り値の型を確認し、valid()メソッドなどを用いて有効性を確かめてから利用してください。取得したPharFileInfoオブジェクトからは、getFilename()などでファイル名を取得できます。Pharの操作はファイルシステムに影響が大きいため、try-catchブロックでPharExceptionを適切に処理し、堅牢なコードを記述することが重要です。

関連コンテンツ