(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-архива.
Версия | Описание |
---|---|
8.1.0 |
Phar::buildFromIterator() больше не возвращает значение false .
|
8.0.0 |
baseDirectory теперь допускает значение null.
|
Пример #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'));
?>