[PHP] Zipアーカイブを操作する

PHPを勉強しながら英語の勉強だ

今回はYoutubeで動画を見ながらPHPを学べるこれをもとにclassの作り方を今一度復習していきたいと思います。

Zip files with PHP: Building the Class

PHPAcademyチャンネル

完成系のソース

Class部分に若干コメントとclassをファイル同じファイルで定義しています。
動画の中ではphpでzipを扱うziparchiveをクラスの中で呼び出して、メソッドで動的にファイルを追加したり、ためておいたファイル名で圧縮できるように拡張しています。

とりあえずソース。

<?php

// Zipを扱うClassをZipperの名前で作る
class Zipper
{
    private $_files = array(), 
            $_zip;

    // Classが作られたら_zipにZipArchive()のインスタンスを作成
    public function __construct()
    {
        $this->_zip = new ZipArchive();
    }

    // addを呼ばれたら_filesの中にファイルのパスを
    public function add($input)
    {
        // 渡されたデータが配列かどうかで処理を変更
        if ( is_array($input) )
        {
            $this->_files = array_merge($this->_files, $input);
        }
        else
        {
            $this->_files[] = $input;
        }
    }

    // 呼び出されたときにaddされたデータでzipアーカイブを試みる
    public function store($location = null)
    {
        if ( count($this->_files) && $location )
        {
            foreach ( $this->_files as $index => $file )
            {
                if ( !file_exists($file) )
                {
                    unset($this->_files[$index]);
                }
            }

            if ( $this->_zip->open($location, file_exists($location) ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE ) )
            {
                foreach ( $this->_files as $file ) {
                    $this->_zip->addFile($file, $file) or die("ERR");
                }

                $this->_zip->close();
            }
            empty($this->_files);
        }
    }
}

$zipper = new Zipper();
$zipper->add('files/one.txt');
$zipper->add( array('files/two.txt', 'files/three.txt') );
$zipper->store('zipped.zip');

zipperクラスについての解説

$zipper = new Zipper();
ここで$zipperにインスタンス化を行っています。
ぶっちゃけadd()とstore()の二つしかメソッドがありません。

$zipper->add(‘ファイルパス’) or add(array(‘ファイルパス1’, ‘ファイルパス2’….))
一個でも配列でファイルパスを渡してクラス内の$_files内へ配列をどんどん追加できるようになっています。
追加されたファイルをstoreで圧縮を試みています。

要所で !file_exists($file) でファイルが存在しない場合には圧縮等をスルーする感じになっていますので、
変なところでファイルがないエラーにならないような仕様になっております。

PHPを英語で解説しているものをがんばって聴いていたのですが、
最後はソースをたどりながら力技で理解したような気がしてならない今日この頃です。