Phar::buildFromIterator
(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)
Phar::buildFromIterator — Создаёт phar-архив из итератора
Описание
Замечание:
Для корректной работы с объектами Phar
этому методу необходима установка значения php.ini phar.readonly
в 0
.
В противном случае, будет выброшено исключение PharException.
Заполняет phar-архив из итератора. Поддерживаются итераторы двух типов:
такие, в которых отображается соответствие имени файла внутри phar-архива к
файлу на диске, и такие как DirectoryIterator, которые возвращают
объекты SplFileInfo. Для итераторов, которые возвращают объекты SplFileInfo,
второй параметр является обязательным.
Список параметров
iterator
-
Любой итератор, который или ассоциативно отображает пути к файлам
внутри phar-архива к файлам на диске, или возвращает объекты SplFileInfo.
baseDirectory
-
Для итераторов, возвращающих объекты SplFileInfo, — часть полного пути каждого
файла, которая должна быть удалена во время его добавления в phar-архив.
Возвращаемые значения
Phar::buildFromIterator() возвращает ассоциативный массив,
в котором отображаются соответствия пути к файлу внутри архива к пути к файлу в
файловой системе.
Ошибки
Этот метод выбрасывает исключение UnexpectedValueException,
когда итератор возвращает некорректные значения, такие как целочисленный ключ
вместо строки. Исключение BadMethodCallException будет брошено,
когда итератор, основанный на SplFileInfo, используется без параметра
baseDirectory
. Исключение PharException
выбрасывается в случае ошибок сохранения phar-архива.
Примеры
Пример #1 Пример использования Phar::buildFromIterator() с объектами SplFileInfo
Для большинства phar-архивов, архив будет отражать фактическую структуру директории,
и второй тип итератора будет наиболее полезным. Например, он будет полезным для создания phar-архива,
содержащего файлы со структурой директорий как в этом примере:
/путь/к/проекту/
config/
dist.xml
debug.xml
lib/
file1.php
file2.php
src/
processthing.php
www/
index.php
cli/
index.php
Для добавления этих файлов в phar-архив "project.phar" может быть использован следующий код:
<?php
// создать с псевдонимом "project.phar"
$phar = new Phar('project.phar', 0, 'project.phar');
$phar->buildFromIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/путь/к/проекту')),
'/путь/к/проекту');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>
После этого файл project.phar может быть использован немедленно.
Такие значения как сжатие и метаданные не устанавливаются методом
Phar::buildFromIterator() и могут быть
установлены после создания phar-архива.
В качестве интересного замечания можно отметить, что Phar::buildFromIterator()
также может быть использован для копирования содержимого существующего phar-архива,
поскольку класс Phar является потомком DirectoryIterator:
<?php
// создать с псевдонимом "project.phar"
$phar = new Phar('project.phar', 0, 'project.phar');
$phar->buildFromIterator(
new RecursiveIteratorIterator(
new Phar('/путь/к/anotherphar.phar')),
'phar:///путь/к/anotherphar.phar/путь/к/проекту');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>
Пример #2 Пример использования Phar::buildFromIterator() с другими типами итераторов
Второй тип предполагает использование любого итератора, возвращаемые значения которого
отображают соответствие имени файла внутри phar-архива к файлу на диске, как в случае с
ArrayIterator:
<?php
// создать с псевдонимом "project.phar"
$phar = new Phar('project.phar', 0, 'project.phar');
$phar->buildFromIterator(
new ArrayIterator(
array(
'путь/внутри/архива/file.php' => dirname(__FILE__) . '/somefile.php',
'друго/путь/внутри/архива/file.jpg' => fopen('/путь/к/bigfile.jpg', 'rb'),
)));
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>