## Utiliser les archives Phar : les classes Phar et PharData

La classe Phar supporte la lecture et la manipulation des archives Phar, ainsi que l'itération à travers la fonctionnalité héritée de la classe RecursiveDirectoryIterator. Avec le support de l'interface ArrayAccess, les fichiers contenus dans une archive Phar peuvent être accédés comme s'ils étaient membres d'un tableau associatif.

La classe PharData étend la classe Phar, et permet la création et la modification d'archives tar et zip non exécutables (données) même si phar.readonly=1 dans php.ini. Ainsi, PharData::setAlias() et PharData::setStub() sont toutes deux désactivées car les concepts d'alias et de conteneur sont restreints aux archives phar exécutables.

Il est important de noter que quand une archive Phar est créée, le chemin complet doit être passé au constructeur de l'objet Phar. Un chemin relatif empêcherait l'initialisation.

En supposant que $p est un objet initialisé de cette façon :

`<?php
$p = new Phar('/chemin/vers/monphar.phar', 0, 'monphar.phar');
?>`

Une archive Phar vide sera créée en tant que /chemin/vers/monphar.phar, ou si /chemin/vers/monphar.phar existe déjà, il sera ouvert de nouveau. Le terme monphar.phar démontre le concept d'un alias qui peut être utilisé pour référencer /chemin/vers/monphar.phar dans des URL comme ceci :

`<?php
// ces deux appels à file_get_contents() sont équivalents si
// /chemin/vers/monphar.phar a un alias explicite de "monphar.phar"
// dans son mainfeste, ou si le phar a été initialisé avec l'instantiation de
// l'objet Phar de l'exemple précedent
$f = file_get_contents('phar:///chemin/vers/monphar.phar/nimportequoi.txt');
$f = file_get_contents('phar://monphar.phar/nimportequoi.txt');
?>`

Avec l'objet Phar $p nouvellement créé, les choses suivantes sont possibles :

- $a = $p['fichier.php'] crée une PharFileInfo qui réfère au contenu de phar://monphar.phar/fichier.php
- $p['fichier.php'] = $v crée un nouveau fichier (phar://monphar.phar/fichier.php), ou écrase un fichier existant au sein de monphar.phar. $v peut être soit une chaîne ou un pointeur vers un fichier ouvert, dans quel cas le contenu du fichier sera utilisé pour créer le nouveau fichier. Notez que $p->addFromString('fichier.php', $v) est équivalent en terme de fonctionnalité au cas ci-dessus. Il est aussi possible d'ajouter le contenu d'un fichier avec $p->addFile('/chemin/vers/fichier.php', 'fichier.php'). Enfin, un répertoire vide peut être créé avec $p->addEmptyDir('vide').
- isset($p['fichier.php']) peut être utilisé pour déterminer si phar://monphar.phar/fichier.php existe au sein de monphar.phar.
- unset($p['fichier.php']) efface phar://monphar.phar/fichier.php de monphar.phar.

De plus, l'objet Phar est le seul moyen d'accéder aux métadonnées spécifiques de Phar, via Phar::getMetadata(), et c'est aussi le seul moyen de régler ou de récupérer le conteneur du chargeur de l'archive Phar via Phar::getStub() et Phar::setStub(). De plus, la compression pour l'archive Phar entière peut être manipulée seulement via la classe Phar.

La liste complète des fonctionnalités de l'objet Phar est documentée ci-dessous.

La classe PharFileInfo étend la classe SplFileInfo et ajoute plusieurs méthodes pour manipuler les métadonnées spécifiques à Phar d'un fichier contenu dans un Phar, telles que manipuler la compression ou les métadonnées.