【PHP8.x】Phar::getMetadata()メソッドの使い方
getMetadataメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getMetadataメソッドは、Pharアーカイブのグローバルなメタデータを取得するメソッドです。Pharアーカイブとは、複数のPHPファイルや関連リソースを単一のファイルにまとめたもので、アプリケーションの配布やデプロイを容易にするために利用されます。このメソッドが取得するメタデータは、Pharアーカイブ全体に付随する追加情報であり、例えばアーカイブのバージョン、作成者、特別な設定など、開発者がそのPharファイルに埋め込んだ任意のデータを含めることができます。
getMetadataメソッドを呼び出すと、これらのメタデータがPHPのシリアライズ形式で返されます。通常、返されたデータはunserialize関数などを用いて元のPHPのデータ構造(配列やオブジェクトなど)に復元し、プログラム内で利用します。もしPharアーカイブにグローバルなメタデータが設定されていない場合は、このメソッドはNULLを返します。この機能を利用することで、プログラムは実行時にPharアーカイブの性質を動的に判断し、適切な処理を行うことが可能になります。これは、ライブラリやフレームワークがPhar形式で配布される際に、その内部情報をプログラム側で利用するために特に重要です。
構文(syntax)
1<?php 2$phar = new Phar('your_archive_name.phar'); 3$metadata = $phar->getMetadata();
引数(parameters)
引数なし
引数はありません
戻り値(return)
mixed
Phar::getMetadata は、Phar アーカイブに保存されているメタデータを返します。メタデータは、アーカイブ作成時に Phar::setMetadata() を使って追加されたもので、様々な型のデータ(文字列、数値、配列、オブジェクトなど)を保持できます。
サンプルコード
PHP Phar::getMetadataでメタデータを取得する
1<?php 2 3// このサンプルコードは、Pharアーカイブの作成とメタデータの取得方法を示します。 4// Pharアーカイブを作成・変更するには、php.iniの 'phar.readonly' を 'Off' に設定するか、 5// 以下のようにスクリプト内で一時的に '0' (false) に設定する必要があります。 6// 本番環境ではセキュリティのため 'On' (true) に設定されていることが多いです。 7ini_set('phar.readonly', 0); 8 9$pharFileName = 'my_application.phar'; // 作成するPharアーカイブのファイル名 10 11try { 12 // 1. 新しいPharアーカイブを作成します。 13 // 第1引数: アーカイブのパス 14 // 第2引数: ファイルの有無に関わらず常に新規作成 (Phar::CREATE) 15 // または、ファイルが存在すれば開く (Phar::OPEN) などのフラグを設定できます。 16 // ここでは既存ファイルがあっても上書きする動作を想定し0とします。 17 // 第3引数: アーカイブの内部的なエイリアス名 (通常はファイル名と同じ) 18 $phar = new Phar($pharFileName, 0, $pharFileName); 19 20 // 2. Pharアーカイブにファイルを追加します。 21 // これらはアーカイブに含まれるダミーのファイルです。 22 $phar->addFromString('index.php', '<?php echo "Hello from my application!";'); 23 $phar->addFromString('config/settings.ini', '[database]\nhost=localhost'); 24 25 // 3. Pharアーカイブ全体のメタデータを設定します。 26 // メタデータは、アーカイブに関する情報(例:バージョン、作者、説明など)を 27 // 保存するために使用されます。PHPの配列、オブジェクト、文字列など、 28 // シリアライズ可能な任意のデータ型を保存できます。 29 $applicationMetadata = [ 30 'name' => 'My Sample Application', 31 'version' => '1.0.0', 32 'author' => 'PHP Expert', 33 'release_date' => date('Y-m-d H:i:s'), 34 'dependencies' => ['php' => '>=8.0'] 35 ]; 36 $phar->setMetadata($applicationMetadata); 37 38 echo "Pharアーカイブ '{$pharFileName}' を作成し、メタデータを設定しました。\n"; 39 40 // 4. 設定したメタデータを Phar::getMetadata() メソッドで取得します。 41 // このメソッドは引数を取りません。 42 // メタデータが設定されていない場合は null を返します。 43 $retrievedMetadata = $phar->getMetadata(); 44 45 if ($retrievedMetadata !== null) { 46 echo "\n--- Phar::getMetadata() で取得したメタデータ ---\n"; 47 // 取得したメタデータを var_dump で表示します。 48 // var_dumpは、データ型や値の詳細を表示するため、初心者がデータの構造を理解するのに役立ちます。 49 var_dump($retrievedMetadata); 50 echo "------------------------------------------------\n"; 51 } else { 52 echo "\nPharアーカイブにメタデータが設定されていませんでした。\n"; 53 } 54 55 // アーカイブを読み取り専用に設定して、誤って変更されるのを防ぐこともできます。 56 // $phar->stopBuffering(); 57 58} catch (PharException $e) { 59 // Phar操作中にエラーが発生した場合、例外をキャッチしてメッセージを表示します。 60 echo "Phar操作中にエラーが発生しました: " . $e->getMessage() . "\n"; 61} finally { 62 // 5. クリーンアップ: サンプルコードが生成したPharファイルを削除します。 63 // これにより、実行後に不要なファイルが残るのを防ぎます。 64 if (file_exists($pharFileName)) { 65 unlink($pharFileName); 66 echo "\nPharアーカイブ '{$pharFileName}' を削除しました。\n"; 67 } 68} 69 70// 注意: ini_setで変更した設定は、スクリプトの実行が終了すると元の値に戻ります。 71// そのため、明示的に ini_restore('phar.readonly'); を呼び出す必要はありません。 72?>
Phar::getMetadata() メソッドは、PHPのPharアーカイブに保存されたメタデータ(追加情報)を取得するために使用されます。
メタデータとは、Pharアーカイブ全体のバージョン、作者、説明、依存関係といった、ファイルの内容とは異なる補足的な情報を指します。この情報は、通常 Phar::setMetadata() メソッドで事前にアーカイブに設定されます。
本メソッドは引数を一切取りません。戻り値は mixed 型で、Phar::setMetadata() で設定された配列、オブジェクト、文字列など、任意のシリアライズ可能なデータ型を返します。もしアーカイブにメタデータが設定されていない場合は、null を返します。
サンプルコードでは、まず phar.readonly 設定を一時的に変更し、Pharファイルの作成・変更を許可しています。次に、'my_application.phar' という新しいアーカイブを作成し、ダミーのファイルを加え、アプリケーション名やバージョン、作者を含むメタデータを Phar::setMetadata() で設定しています。
その後、Phar::getMetadata() を呼び出すことで、先ほど設定したメタデータを正確に取得し、var_dump 関数でその詳細な内容を表示しています。これにより、Pharアーカイブに付随する情報を実行時に容易に管理・取得できることが示されています。処理の最後には、生成されたPharファイルをクリーンアップとして削除しています。
このサンプルコードはPharアーカイブの作成とメタデータ取得の基本を示しています。Pharアーカイブを作成・変更する際には、セキュリティのため通常有効なphar.readonly設定を、ini_setなどで一時的に無効にする必要がありますが、本番環境ではセキュリティリスクを考慮し慎重に扱ってください。Phar::getMetadata()メソッドは、引数なしでアーカイブに保存されたメタデータを取得し、設定されていなければnullを返しますので、取得後のnullチェックが重要です。Phar操作はPharExceptionを発生させる可能性があるため、try-catchブロックでエラーを適切に処理してください。ini_setによる設定変更はスクリプト終了時に元に戻るため、明示的な復元は不要です。