Les derniers articles
Introduction à la Standard PHP Librairy (SPL)
Date :: 2005-01-22
Last Updated :: 2005-01-24
Introduction
SPL (Standard PHP Librairy),
est une extension écrite par Marcus Boerger,
valable et compilée par défaut en PHP5. Elle
apporte une collection de classes, de classes abstraites et d'interfaces qui permettent de solutionner élégamment des problèmes récurents
concernant le parcours de données en boucle.
En effet, que ce soit le parcours des fichiers d'un répertoire, le parcours des résultats provenant d'une requête SQL,
le parcours d'un fichier ligne par ligne, on retrouve de nombreux points communs.
Cette extension propose donc des solutions communes pour aborder tous ces traitements,
ce qui permet de ne pas avoir à réinventer la roue à chaque fois, donc une meilleure réutilisabilité du code.
Pour cette introduction, nous prendrons en exemple la classe directoryIterator.
La classe directoryIterator
La classe directoryIterator propose des méthodes pour parcourir un répertoire et récupérer des informations sur les différentes entrées rencontrées.
Elle implémente l'interface iterator.
Vous pouvez consulter
ici
la liste des méthodes de cette classe.
A titre pédagogique
Comme toute classe, il est possible d'appeler directement les méthodes publiques de la classe directoryIterator comme suit :
- iterator::valid() : Vérifie qu'il y a une entrée suivante,
- iterator::next() : Déplace le pointeur vers l'entrée suivante,
- directoryIterator::getFilename() Renvoie le nom du fichier de l'entrée courante.
try {
$dir = new directoryIterator('.');
while( $dir->valid() ) {
echo $dir->getFilename() , '<br/>';
$dir->next();
}
} catch (Exception $e) {
echo $e;
}
?>
Parcourir un répertoire avec foreach
Pour afficher simplement la liste des fichiers contenus dans un répertoire,
il est également possible d'utiliser une structure foreach.
En effet, la classe directoryIterator implémente l'interface iterator,
ce qui signifie que foreach ne va pas se contenter d'afficher les propriétés de l'objet,
mais va appeler différentes méthodes ( current(), next(), valid(), etc )
que la classe directoryIterator implémente.
Pour parcourir notre répertoire et afficher la liste des entrées, nous pouvons donc procéder comme suit :
try {
$dir = new directoryIterator('.');
foreach($dir as $value) {
echo $value, '<br/>';
}
} catch (Exception $e) {
echo $e;
}
?>
Modifier le comportement par défaut pour nos besoins
Renvoyer la taille du fichier au lieu de son nom
Il est donc possible, en utilisant l'héritage, de créer une classe sizeDirectoryIterator,
qui étendra les fonctionnalités de la classe directoryIterator.
On utilisera le polymorphisme pour réécrire la méthode current()
pour qu'elle nous renvoie la taille de l'entrée courante , si c'est un fichier, au lieu de son nom.
Nous utiliserons à cet effet les méthodes suivantes :
- directoryIterator::isFile() : Retourne TRUE ou FALSE si l'entrée courante est un fichier,
- directoryIterator::getSize() : Retourne la taille en octets du fichier courant.
class sizeDirectoryIterator extends directoryIterator implements iterator {
function current() {
return parent::isFile() ? parent::getSize() : 0;
}
}
try {
$S = new sizeDirectoryIterator('.');
foreach($S as $size) {
echo $size , '<br/>';
}
} catch (Exception $e) {
echo $e;
}
?>
Chercher les images contenues dans un répertoire
Sur ce même principe, nous allons étendre les fonctionnalités de la classe directoryIterator en y ajoutant une méthode, isImage(), qui sera chargée de vérifier que l'entrée courante est une image. Nous réécrirons également la méthode valid() afin qu'elle tienne uniquement compte des images.
class imageFilesIterator extends directoryIterator {
function isImage() {
if(!parent::isFile() or !preg_match('`\.(gif|png|jpe?g)$`i', parent::getFilename()) ) {
return false;
}
return true;
}
function valid() {
if (parent::valid()) {
if (!$this->isImage()) {
parent::next();
return $this->valid();
}
return true;
}
return false;
}
}
try {
$O = new imageFilesIterator('.');
foreach ($O as $imageFile) {
echo $imageFile,'<br/>';;
}
} catch(Exception $e) {
echo $e;
}
?>
Exemple : Afficher la structure d'un répertoire
Voici une petite classe contenant une méthode récursive qui vous permettra d'afficher un arbre
représentatif de la structure d'un répertoire.
Cette classe est basée sur la classe recursiveDirectoryIterator qui introduit deux
méthodes supplémentaires par rapport à la classe directoryIterator :
- recursiveDirectoryIterator::hasChildren() : Retourne TRUE ou FALSE si le répertoire courant contient des entrées,
- recursiveDirectoryIterator::getChildren() : Retourne un itérateur pour le répertoire courant.
class treeDirectory {
private $iterator = false;
public function __construct($directory) {
$this->iterator = new recursiveDirectoryIterator($directory);
}
public function displayTree($iterator = false) {
if(!$iterator) {
$iterator = $this->iterator;
}
echo '<ul>';
while($iterator->valid()) {
if($iterator->isDir() AND !$iterator->isDot()) {
echo '<li><strong style="color: red;">' , $iterator->current() , '</strong></li>';
if($iterator->hasChildren()) {
echo '<ul>' , $this->displayTree($iterator->getChildren()) , '</ul>';
}
} else {
if($iterator->isFile()) {
echo '<li>' , $iterator->getFilename() , '</li>';
}
}
$iterator->next();
}
echo '</ul>';
}
}
try {
$D = new treeDirectory('.');
$D-> displayTree();
} catch(Exception $e) {
echo '<pre>' , $e , '</pre>';
}
?>
Une amélioration possible de cette classe consisterait à définir une limite de profondeur pour la récursivité. N'hésitez-pas à la modifier et à nous la soumettre :)
Liens
Fabrice Lezoray < fabrice AT scriptsphp.org >.
Trackback
Il n'y a pas de trackback recensé pour cet article.
Faire un trackback sur cet article http://classes.scriptsphp.org/Trackbackserver.Introduction-a-SPL, récupérer les trackback sur cet article