前回の続き?
PharDataクラスは、Pharをextendsしているのでpharの関連機能かと思いきや、実はphar全く関係なしに使うことができる圧縮ファイル操作クラスで、どっちかというとZipArchiveの仲間です。
またPharのようにphp.iniを設定することなく使用することができます。
とりあえず適当なzipファイルに対して使用してみます。
PharData extends Phar extends RecursiveDirectoryIterator extends FilesystemIteratorとなっており、FilesystemIterator::CURRENT_AS_FILEINFOとかFilesystemIterator::KEY_AS_FILENAMEとかのクラス定数が定義されているのでこれらを設定することができます。
http://www.php.net/manual/ja/class.filesystemiterator.php#filesystemiterator.constants
あとはPharData::addFile()で圧縮ファイルを解凍せずにファイルを追加したり、PharData::delete()で削除したりといった操作を簡単に行うことができます。
ちなみにforeachとかに使うインデックスはオブジェクト作成時に作成したらそのままらしく、addFile()後にループしても出てきません。
それはまだいいのですがdelete()後にforeachするとFatal errorになります。
Fatal error: Uncaught exception 'RuntimeException' with message 'Cannot access phar file entry '/hoge.gif' in archive 'C:/hoge.zip''
まあ正直素直にZipArchive使っておけば、という気がしないでもない。
PharDataクラスは、Pharをextendsしているのでpharの関連機能かと思いきや、実はphar全く関係なしに使うことができる圧縮ファイル操作クラスで、どっちかというとZipArchiveの仲間です。
またPharのようにphp.iniを設定することなく使用することができます。
とりあえず適当なzipファイルに対して使用してみます。
<?php
//コンストラクタ
$pharData = new PharData('hoge.zip',
FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::KEY_AS_FILENAME
);
//zip内のファイルを順に辿る
foreach($pharData as $key=>$val){
//FilesystemIterator::KEY_AS_FILENAMEを指定しているので$keyはファイル名になる
print($key);
//FilesystemIterator::CURRENT_AS_FILEINFOを指定しているので$valはPharFileInfoクラスになる
print(get_class($val));
}
//zipにファイル追加
$pharData->addFile('mushroom.gif');
$pharData->addFile('mushroom.gif', 'mushroom2.gif');
//zipのファイル削除
$pharData->delete('mushroom.gif');
unlink('phar://hoge.zip/mushroom2.gif');
PharDataのコンストラクタの例にはCURRENT_AS_FILEINFOとかKEY_AS_FILENAMEとかいう謎の定数が書かれているのですが、これらは実際には定義されていません。PharData extends Phar extends RecursiveDirectoryIterator extends FilesystemIteratorとなっており、FilesystemIterator::CURRENT_AS_FILEINFOとかFilesystemIterator::KEY_AS_FILENAMEとかのクラス定数が定義されているのでこれらを設定することができます。
http://www.php.net/manual/ja/class.filesystemiterator.php#filesystemiterator.constants
あとはPharData::addFile()で圧縮ファイルを解凍せずにファイルを追加したり、PharData::delete()で削除したりといった操作を簡単に行うことができます。
ちなみにforeachとかに使うインデックスはオブジェクト作成時に作成したらそのままらしく、addFile()後にループしても出てきません。
それはまだいいのですがdelete()後にforeachするとFatal errorになります。
Fatal error: Uncaught exception 'RuntimeException' with message 'Cannot access phar file entry '/hoge.gif' in archive 'C:/hoge.zip''
まあ正直素直にZipArchive使っておけば、という気がしないでもない。
PR
トラックバック
トラックバックURL: