Класс обертки ZipArchive by Koenig

1.17K
.
(\/)____o_O____(\/)
Delphinum, сначало одно было, потом другое, забыл убрать
.
(\/)____o_O____(\/)
<?php
/**
* Kzip
*
* Обертка для ZipArchive
*
* @author Koenig <http://johncms.com/users/profile.php?user=6565>
* @version 0.2
*/ 

class Kzip
{
  /**
  * 
  * 
  * @var ZipArchive
  */
  private $zip;
  /**
  * constructor
  * 
  * @param mixed $archive
  * @return Kzip
  */
  public function __construct($archive)
  {
    if (!extension_loaded('zip')) {
      die('Unsupported Ziparchive class');
    }
    $this->zip = new ZipArchive();
    if (file_exists($archive)) {
      $this->zip->open($archive);
    }
    else {
      $this->zip->open($archive, ZipArchive::CREATE);
    }
  }
  /**
  * extract from directory
  * 
  * @param mixed $dir
  */
  public function extractTo($dir)
  {
    $array = $this->getNames();
    foreach($array['cp'] as $k => $file) {
      $str = $this->zip->getFromName($file);
      $pos = strrpos($array['utf'][$k], DIRECTORY_SEPARATOR);
      $ee = str_split($array['utf'][$k], $pos + 1);
      if (!is_dir($dir . $ee[0])) {
        mkdir($dir . $ee[0], 0777, true);
      }
      file_put_contents($dir . $array['utf'][$k], $str);
    }
  }
  /**
  * get array names of files
  * @param void
  * @return array
  */
  public function getNames()
  {
    $names = array();
    for ($i = 0; $i < $this->zip->numFiles; $i++) {
      $names['utf'][] = $this->fineName($this->zip->getNameIndex($i) , 1);
      $names['cp'][] = $this->zip->getNameIndex($i);
    }
    return $names;
  }
  /**
  * put zip archive directory
  * 
  * @param mixed $dir
  */
  public function addFromDirecory($dir)
  {
    foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS) , RecursiveIteratorIterator::CHILD_FIRST) as $list) {
      if ($list->isFile()) {
        $this->zip->addFile($list->getPathname() , $this->fineName($list->getPathname()));
      }
    }
  }
  /**
  * put your comment there...
  * 
  * @param mixed $path
  * @param int $mode
  * @return mixed
  */
  public function fineName($path, $mode = 0)
  {
    return (!$mode) ? iconv('UTF-8', 'CP866//TRANSLIT//IGNORE', $path) : iconv('CP866', 'UTF-8//TRANSLIT//IGNORE', $path);
  }
  /**
  * destructor
  * @param void
  * 
  */
  public function close()
  {
    $this->zip->close();
  }
}
?>
Прикрепленные файлы:
.
Используй исключения вместо die().
.
(\/)____o_O____(\/)
L!MP, это можно, но смысл если нет класса в системе? куча ошибок и вопросов
.
Koenig, почему же "куча ошибок", ошибка только одна - нет такого то файла архива, попробуйте позже - за что же ты бедный процесс убиваешь? )))
.
(\/)____o_O____(\/)
Delphinum, логика нарушается ведь, далее строки где могут появиться ошибки, разве процесс убивается? потомок?
.
Koenig, Тут смотри в чём дело.
Вот у тебя в конструкторе есть строка:
if (!extension_loaded('zip')) {
      die('Unsupported Ziparchive class');
    }


В этом случае мы увидим белую страницу с текстом Unsupported Ziparchive class
Ты не оставляешь пользователю твоего класса выбора.

А вот в этом случае:

if (!extension_loaded('zip')) {
    throw new \RuntimeException('Unsupported Ziparchive class');
}


Я смогу сделать так:

try {
    new Zip();
} catch (\RuntimeException $e) {
    $error = $e->getMessage();
}


И уже далее, например, сохранить сообщение в лог а пользователю отдать человеко-понятное сообщение.
.
(\/)____o_O____(\/)
reaper, это то понятно, но класс публичный, сразу после запуска станет ясно, нужен он или нет, лишнее уже можно и самому до воротить кому надо
.
Koenig, WUT? По подробнее можно?
Я считаю, что лучше сразу всё делать заранее.
Представь, что было бы, если бы все библиотеки так писались.
В любой исключительной ситуации убивать процесс - это плохо.
С таким уже успехом я мог бы создать тему мол "смотрите, что я в документации нашел, кому надо сами обёртку напишите."
.
(\/)____o_O____(\/)
reaper, причем тут процесс? это остановка выполнения, ты на денвере посмотри , убьется процесс в диспетчере
Всего: 34