Phar アーカイブの使用法: Phar クラスおよび PharData クラス

Phar クラスは Phar アーカイブの読み込みや操作をサポートしています。 また RecursiveDirectoryIterator クラスを継承しているため、順次処理も可能です。 ArrayAccess インターフェイスをサポートしているので、 Phar アーカイブ内のファイルに対して、 それがまるで連想配列であるかのようにアクセスすることができます。

PharData クラスは Phar を継承したもので、実行可能でない (データ) tar アーカイブおよび zip アーカイブなら php.ini で phar.readonly=1 であっても作成/変更できるようになります。 このクラスでは PharData::setAlias()PharData::setStub() は使用不可能になっています。というのもエイリアスやスタブというのは 実行可能な phar アーカイブに独特の概念だからです。

注意すべき点は、Phar アーカイブを作成する際には Phar のコンストラクタに フルパスを渡さなければならないということです。 相対パスでは初期化に失敗します。

$p が、次のように作成した Phar オブジェクトであるとしましょう。

<?php
$p 
= new Phar('/path/to/myphar.phar'0'myphar.phar');
?>

空の Phar アーカイブが /path/to/myphar.phar に作成されます。もし /path/to/myphar.phar が既に存在する場合は、それを再度オープンします。 リテラル myphar.phar は、エイリアスを表します。 これを用いると、URL で /path/to/myphar.phar を参照する際に次のようにできます。

<?php
// これらのふたつの file_get_contents() コールが同等となるのは、
// /path/to/myphar.phar のマニフェストでエイリアス "myphar.phar"
// が明示的に指定されている場合か、先ほどの例のように
// Phar オブジェクトを初期化した場合です。
$f file_get_contents('phar:///path/to/myphar.phar/whatever.txt');
$f file_get_contents('phar://myphar.phar/whatever.txt');
?>

新しく作成した Phar オブジェクト $p に対して、次のような処理が可能となります。

  • $a = $p['file.php'] とすると、 phar://myphar.phar/file.php の中身を参照する PharFileInfo クラスが作成されます。
  • $p['file.php'] = $v とすると、 myphar.phar の中に新しいファイル (phar://myphar.phar/file.php) を作成するか、あるいは同名のファイルを上書きします。 $v には、文字列あるいはファイルポインタのいずれかを指定できます。 ファイルポインタを指定した場合は、その中身全体をもとにして新しいファイルを作成します。 $p->addFromString('file.php', $v) は、 機能的に上と同じであることに注意しましょう。また、ファイルの中身を $p->addFile('/path/to/file.php', 'file.php') で追加することもできます。最後に、空のディレクトリを作成するには $p->addEmptyDir('empty') とします。
  • isset($p['file.php']) とすると、phar://myphar.phar/file.phpmyphar.phar の中に存在するかどうかがわかります。
  • unset($p['file.php']) とすると、 phar://myphar.phar/file.phpmyphar.phar から削除します。

さらに、Phar 固有のメタデータにアクセスするためには Phar オブジェクトを使用することが唯一の方法となります。そのためには Phar::getMetadata() を使用します。また、Phar アーカイブの PHP ローダスタブを設定したり取得したりするための唯一の方法が Phar::getStub() および Phar::setStub() です。 また、Phar アーカイブ全体の圧縮を行うには Phar クラスが必要となります。

Phar オブジェクトの全機能の一覧については、以下で説明します。

PharFileInfo クラスは SplFileInfo クラスを継承しており、Phar 内のファイルについての Phar 固有の情報 (圧縮情報やメタデータなど) を扱うためのメソッドが追加されています。