PHP 8.5.0 Alpha 1 available for testing

Phar::buildFromIterator

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::buildFromIteratorConstruye un archivo phar a partir de un iterador

Descripción

public Phar::buildFromIterator(Traversable $iterator, ?string $baseDirectory = null): array

Nota:

Este método requiere que la opción de php.ini phar.readonly esté establecida a 0 para que trabaje con objetos Phar. De otra manera, se lanzará una excepción de tipo PharException.

Rellena un archivo phar a partir de un iterador. Dos estilos de iterador son soportados: los iteradores que hacen corresponder el nombre de archivo dentro del phar con el nombre de un archivo en el disco, y los iteradores como DirectoryIterator que devuelven objetos SplFileInfo. Para los iteradores que devuelven objetos SplFileInfo, el segundo parámetro es obligatorio.

Parámetros

iterator

Un iterador que asocia un archivo con una posición, o bien devuelve objetos SplFileInfo.

baseDirectory

Para los iteradores que devuelven objetos SplFileInfo, la porción de ruta absoluta de cada archivo que debe ser eliminada al añadir al archivo phar.

Valores devueltos

Phar::buildFromIterator() devuelve un array asociativo que asocia la representación interna del archivo a un camino absoluto en el sistema.

Errores/Excepciones

Este método emite una excepción UnexpectedValueException cuando el iterador devuelve valores falsos, tales como una clave entera en lugar de una cadena; una excepción BadMethodCallException cuando un iterador basado en SplFileInfo es pasado sin parámetro baseDirectory, o una excepción PharException si ha habido errores al guardar el archivo phar.

Historial de cambios

Versión Descripción
8.1.0 Phar::buildFromIterator() ya no devuelve false ahora.
8.0.0 baseDirectory ahora es nullable.

Ejemplos

Ejemplo #1 Ejemplo con Phar::buildFromIterator() y SplFileInfo

Para la mayoría de archivos phar, el archivo refleja la estructura de un directorio, y el segundo estilo es el más útil. Por ejemplo, para crear un archivo phar que contenga los archivos de la estructura del directorio:

/ruta/hacia/proyecto/
                 config/
                        dist.xml
                        debug.xml
                 lib/
                     file1.php
                     file2.php
                 src/
                     processthing.php
                 www/
                     index.php
                 cli/
                     index.php

Este código puede ser utilizado para añadir al archivo "proyecto.phar":

<?php
// crea con el alias "proyecto.phar"
$phar = new Phar('proyecto.phar', 0, 'proyecto.phar');
$phar->buildFromIterator(
new
RecursiveIteratorIterator(
new
RecursiveDirectoryIterator('/ruta/hacia/proyecto')),
'/ruta/hacia/proyecto');
$phar->setStub($phar->createDefaultStub('cli/index.php', 'www/index.php'));
?>

El archivo proyecto.phar puede ser utilizado inmediatamente. Phar::buildFromIterator() no establece parámetros tales como la compresión o los metadatos; esto puede ser hecho después de crear el archivo phar.

Es interesante notar que Phar::buildFromIterator() también puede ser utilizado para copiar los elementos de un archivo phar existente, ya que el objeto Phar hereda de DirectoryIterator:

<?php
// crea con el alias "proyecto.phar"
$phar = new Phar('proyecto.phar', 0, 'proyecto.phar');
$phar->buildFromIterator(
new
RecursiveIteratorIterator(
new
Phar('/ruta/hacia/otrophar.phar')),
'phar:///ruta/hacia/otrophar.phar/ruta/hacia/proyecto');
$phar->setStub($phar->createDefaultWebStub('cli/index.php', 'www/index.php'));
?>

Ejemplo #2 Ejemplo con Phar::buildFromIterator() y otros iteradores

La segunda forma de iterador puede ser utilizada con cualquier iterador que devuelva una correspondencia clave => valor, tales como ArrayIterator:

<?php
// crea con el alias "proyecto.phar"
$phar = new Phar('proyecto.phar', 0, 'proyecto.phar');
$phar->buildFromIterator(
new
ArrayIterator(
array(
'interna/fichero.php' => dirname(__FILE__) . '/unfichero.php',
'otro/fichero.jpg' => fopen('/ruta/hacia/grande.jpg', 'rb'),
)));
$phar->setStub($phar->createDefaultWebStub('cli/index.php', 'www/index.php'));
?>

Ver también

add a note

User Contributed Notes 2 notes

up
14
cweiske at php dot net
10 years ago
You have to set a flag on the RecursiveDirectoryIterator because by default, the current (".") and parent directory ("..") are included in the listing. This leads to an error message similar to "returned a path ".." that is not in the base directory".

To fix this, use "SKIP_DOTS":

<?php
new RecursiveDirectoryIterator(
$srcRoot, FilesystemIterator::SKIP_DOTS
);
?>
up
0
M8
8 years ago
Phars created from iterator (unlike from directory) does not have full-fledged directory structure. For example, functions like opendir() will fail, although fopen() does not.
To Top