Dans PHP, lors du traitement des fichiers ZIP, nous utilisons souvent la fonction zip_read () pour lire les entrées dans le package compressé. Cependant, de nombreux débutants ont constaté que cette fonction ne renvoie pas un objet ou un tableau, mais un "type de ressource". Cela fait que de nombreux développeurs se demandent: pourquoi PHP est-il conçu comme ça? Quelle est la signification de cette conception? Cet article explorera cette question en profondeur.
Le type de ressource est un type de données spécial dans PHP, qui représente une poignée d'une ressource externe. Les types de ressources communs incluent des poignées de fichiers, des connexions de base de données, des poignées d'image, etc. La ressource elle-même ne contient pas de données, mais une référence à la ressource système sous-jacente.
Caractéristiques des types de ressources:
Les ressources sont gérées en interne par PHP.
Les ressources ne peuvent pas fonctionner directement comme des tableaux ou des objets.
Après avoir utilisé la ressource, vous devez appeler la fonction de fermeture ou de libération correspondante, telle que fclose () .
L'intention d'origine de la fonction zip_read () est de lire efficacement les entrées dans des fichiers compressés. Il appartient à l'interface sous-jacente dans l'extension zip de PHP.
$zip = zip_open("http://m66.net/example.zip");
if (is_resource($zip)) {
while ($zip_entry = zip_read($zip)) {
echo "Entry name: " . zip_entry_name($zip_entry) . "\n";
}
zip_close($zip);
}
Dans le code ci-dessus, zip_open () renvoie un type de ressource, indiquant la poignée ouverte du fichier zip, et zip_read () renvoie également le type de ressource, indiquant l'entrée zip actuellement lue.
Il existe plusieurs raisons principales pour lesquelles les ressources sont renvoyées au lieu d'objets ou de tableaux ici:
Les ressources sont des poignées légères et PHP gère les ressources en interne plus d'économie de mémoire que les objets. Cette conception peut réduire efficacement les frais généraux de performances lors de la gestion de grands fichiers compressés.
zip_read () est une fonction relativement précoce. Il est implémenté en fonction de l'interface sous-jacente de la bibliothèque C. Le modèle d'objet PHP n'était pas suffisamment mature pendant la conception, et l'utilisation de types de ressources est plus conforme à la méthode d'implémentation à ce moment-là.
Les types de ressources permettent aux développeurs d'exploiter plus de manière plus flexible le contenu du package compressé et de lire les données étape par étape à travers plusieurs fonctions associées (telles que ZIP_ENTRY_OPEN () , ZIP_ENTRY_READ () , ZIP_ENTRY_CLOSE () ), améliorant le contrôle du processus.
Bien que les types de ressources soient efficaces, ils ne sont pas suffisamment intuitifs pour fonctionner et sont sujets à des erreurs. Après PHP 5.2, il est recommandé d'utiliser la classe Ziparchive pour gérer les fichiers ZIP. Il résume les opérations zip d'une manière orientée objet, ce qui la rend plus moderne et plus facile à utiliser.
Exemple:
$zip = new ZipArchive();
if ($zip->open('http://m66.net/example.zip') === TRUE) {
for ($i = 0; $i < $zip->numFiles; $i++) {
echo "Entry name: " . $zip->getNameIndex($i) . "\n";
}
$zip->close();
}
Avantages de Ziparchive :
Renvoie l'objet, le code est plus facile à lire et à maintenir.
Des méthodes plus pratiques sont encapsulées.
Mécanisme de gestion des erreurs intégré.
zip_read () renvoie le type de ressource car son objectif de conception est une interface sous-jacente de bas niveau, légère et efficace.
Les types de ressources facilitent PHP pour gérer les ressources système sous-jacentes en interne, enregistrer la mémoire et améliorer les performances.
Cette conception apporte les inconvénients du fonctionnement complexe et de la prétention des erreurs.
Le développement de PHP moderne recommande d'utiliser une classe Ziparchive , qui est plus intuitive et riche en fonctionnalités.
Comprendre les raisons de cette conception nous aide à sélectionner plus rationnellement et à utiliser l'interface de fonctionnement ZIP fournie par PHP.