Utilizar Archivos Phar: las clases Phar y PharData

La clase Phar admite la lectura y la manipulación de archivos Phar, así como la iteración a través de la funcionalidad de la clase RecursiveDirectoryIterator. Con el soporte para la interfaz ArrayAccess, se puede acceder a los ficheros que están dentro de un archivo Phar como si fueran parte de un array asociativo.

La clase PharData extiende la clase Phar, y permite crear y modificar archivos tar y zip no ejecutables (datos) incluso si phar.readonly=1 en php.ini. Por lo tanto, PharData::setAlias() y PharData::setStub() están desactivados ya que los conceptos de alias y rutina de interoperabilidad (stub) son válidos únicamente para archivos phar ejecutables.

Observe que al crear un archivo Phar, se debería pasar la ruta completa al contructor del objeto de la clase Phar. Las rutas relativas causarán un error en la inicialización.

Asumiendo que $p es un objeto de la clase Phar inicializado como sigue:

<?php
$p 
= new Phar('/ruta/a/miphar.phar'0'miphar.phar');
?>

se creará un archivo Phar vacío en /ruta/a/miphar.phar, o si /ruta/a/miphar.phar ya existe, se abrirá de nuevo. El literal miphar.phar demuestra el concepto de un alias que puede ser usado para referenciar a /ruta/a/miphar.phar en URLs, como en:

<?php
// estas dos llamadas a file_get_contents() son equivalentes si
// /ruta/a/miphar.phar tiene un alias especificado como "miphar.phar"
// en su manifiesto, o si el phar fue inicializado con la
// configuración del objeto Phar del ejemplo anterior
$f file_get_contents('phar:///ruta/a/miphar.phar/loquesea.txt');
$f file_get_contents('phar://miphar.phar/loquesea.txt');
?>

Con el recién creado objeto $p de la clase Phar, lo siguiente es posible:

  • $a = $p['fichero.php'] creates a PharFileInfo class that refers to the contents of phar://miphar.phar/fichero.php
  • $p['fichero.php'] = $v crea un nuevo fichero (phar://miphar.phar/fichero.php), o sobrescribe un fichero existente dentro de miphar.phar. $v puede ser una cadena o un puntero de fichero abierto, en cuyo caso todo el contenido del fichero se usará para crear el nuevo fichero. Observe que $p->addFromString('fichero.php', $v) es funcionalmente equivalente a lo de más arriba. También es posible añadir el contenido de un fichero con $p->addFile('/path/to/fichero.php', 'fichero.php'). Por ultimo, se puede crear un directorio vacío con $p->addEmptyDir('vacio').
  • isset($p['fichero.php']) se puede usar para determinar si phar://miphar.phar/fichero.php existe dentro de miphar.phar.
  • unset($p['fichero.php']) borra phar://miphar.phar/fichero.php de miphar.phar.

Además, el objeto de la clase Phar es la única manera de acceder a metainformación específica de Phar, a través de Phar::getMetadata(), y la única manera de establecer o recuperar una rutina de interoperabilidad (stub) del cargador de PHP de un archivo Phar a través de Phar::getStub() y Phar::setStub(). Además, la compresión del archivo completo Phar de una vez, sólo puede ser manipulada utilizando la clase Phar.

La lista completa de la funcionalidad de objetos de la clase Phar está documentada más adelante.

La clase PharFileInfo extiende a la clase SplFileInfo, y añade varios métodos para manipular detalles específicos de Phar de un fichero contenido en un Phar, tales como la manipulación de la compresión y la metainformación.