UE 503 L3 MIAGE Initiation Réseau et Programmation Web Séance 05 PHP Nazih OUWAYED nazih.ouwayed@loria.fr http://www.loria.fr/~ouwayedn/ Fichiers et Année Universitaire 2010/2011 2 Introduction g Généralités De nombreuses applications travaillent avec des fichiers Les fichiers permettent de sauvegarder des données sur disque et les rendent en quelque sorte pérennes On peut les utiliser dans des sessions ultérieures Il existe de nombreuses fonctions pour les lire, les remplir, les supprimer et même changer leurs attributs Dans ce chapitre on va s intéresser aux opérations de lecture/écriture puis nous regarderons quelques opérations de leur manipulation sur disque 3 g Fichier texte PHP ne lit et n'écrit dans les fichiers que sous forme de texte Un fichier texte est un fichier caractère, construit sous un éditeur de texte Il est organisé sous la forme d une suite de lignes de caractères Le fichier est suffixé par.txt g Comment travailler sur un fichier texte? Pour travailler sur un fichier texte, il faut l ouvrir On utilise pour cela fonction fopen ici on ouvre le fichier en lecture : " r" $f=fopen("exemple.txt","r"); 4 1
r : read w: write a:apend g Les différents modes d ouverture 'r' ouvre en lecture seule : le pointeur est placé au début du fichier. 'r+' ouvre en lecture/écriture : le pointeur est placé au début du fichier. 'w' ouvre en écriture seule : le pointeur est placé au début du fichier. Réduit la taille du fichier à 0. Tentative de création si celui ci n'existe pas. 'w+' ouvre en lecture/écriture : le pointeur est placé au début du fichier. Réduit la taille du fichier à 0. Tentative de création si celui ci n'existe pas. 'a' ouvre en écriture seule : le pointeur est placé au début du fichier. Tentative de création si celui ce n'existe pas. r : read w: write a:apend g Les différents modes d ouverture 'a+' ouvre en lecture/écriture : le pointeur est placé à la fin du fichier. Tentative de création si celui ce n'existe pas. 'x' orée et ouvre le fichier en lecture seule : le pointeur est placé au début du fichier. Si le fichier existe déjà, fopen va échouer 'x+' orée et ouvre le fichier en lecture/écriture : le pointeur est placé au début du fichier. Si le fichier existe déjà, fopen va échouer 5 6 g Remarque Si la fonction fopen() échoue lors de l'ouverture du fichier, celle ci retourne 0 $f=fopen("exemple.txt","r"); if ($f==0) echo("impossible d'ouvrir le fichier!"); else echo("fichier ouvert avec succès!"); g Fermer un fichier La fonction fclose() est utilisée pour fermer un fichier fclose($f); g Écrire dans un fichier L'écriture dans un fichier texte se fait avec la fonction fwrite(). Pour faire des retours à la ligne vous devez utiliser : "\r\n" $f = 'exemple.txt'; $text = "ma chaine de caractères"; $handle = fopen($f,"w"); // Regarde si le fichier est accessible en écriture if (is_writable($f)) { // Écrit $text et vérifie if (fwrite($handle, $text) === FALSE) { echo 'Impossible d\'écrire dans le fichier '.$f.''; exit; else { echo 'Ecriture terminée'; fclose($handle); else { echo 'Impossible d\'écrire dans le fichier '.$f.''; 7 8 2
g Exemple: compter le nombre de lignes A l'aide de deux fonctions file() place le fichier dans un tableau count () compte les lignes du tableau $f = 'exemple.txt'; if(file_exists($f)) { // place le contenu du fichier dans un tableau $tab = file($f); // compte le nombre de ligne $nb = count($tab); echo $nb; // Affiche le résultat 9 g Trouver la fin d'un fichier La fonction feof() est utilisée pour tester la fin du fichier if (feof($f)) echo 'Fin du fichier'; 10 g Récupérer le contenu Nous allons nous servir de la fonction file_get_contents pour récupérer l'intégralité du fichier $contents = file_get_contents("url du fichier"); // ou avec fopen, fread, fclose $fd = fopen($url, 'r'); // Ouverture du fichier en lecture seule while(!feof($fd)) { //Récupère le contenu du fichier et le place dans une chaîne de caractères $contents.= fread($fd, 8192);//Lire 8192 octets fclose($fd); //Fermeture du fichier 11 g Comment lire caractère par caractère? Par fgetc() if (!($f=fopen("exemple.txt","r"))) exit("impossible d'ouvrir le fichier."); while (!feof($f)) { $texte=fgetc($f); echo $texte; fclose($f); 12 3
g Comment lire un fichier ligne par ligne? Par fgets() : Exemple $ressource_fichier = fopen('test.txt', 'r'); if($ressource_fichier) { $contenu_fichier = ''; //tant que l'on est pas à la fin du fichier while(!feof($ressource_fichier)) { //récupère la ligne en cours et l'ajoute au contenu de la variable $contenu_fichier.= fgets($ressource_fichier); //$contenu_fichier fclose($ressource_fichier); echo $contenu_fichier; //affiche le contenu du fichier 13 g Positionnement dans le fichier rewind() : place le pointeur au début du fichier fseek() : place le pointeur en un point du fichier ftell() : trouve la position du pointeur g Exemple : <? $fp=fopen("monfichier.txt", "rb"); //On se positionne au 42ème octet fseek($fp,42); //On récupère l'emplacement du pointeur $position=ftell($fp); // On se positionne au premier octet rewind($fp); 14 g Création fopen() touch () // touch( exemple.txt ); g Effacement Unlink() Exemple <? $fichier='fantome.txt'; if (file_exists($fichier)){ unlink($fichier); 15 g Taille de fichier $fichier='monfichier.txt'; echo $fichier. 'fait'.filesize($fichier). octets'; g Parcourir un répertoire Il s agit de parcourir un répertoire et d afficher la liste des noms de fichiers contenus : $dir=dir('.'); //le. indique le répertoire courant while($nom=$dir->read()){ echo $nom,'<br>'; $dir->close(); 16 4
g Parcourir un répertoire Utilisation de opendir(), readdir() et closedir() avec le même résultat que précédemment : <? //script affiche tous les fichiers d'un //répertoire $dir=opendir("."); while($nom=readdir($dir)){ echo $nom.'<br>'; closedir($dir); 17 g Position dans l arborescence getcwd() permet de connaître le nom du répertoire courant echo repertoire courant :.getcwd(); chdir() pour remonter dans l arborescence echo repertoire courant :.getcwd(). <br> ; chdir(.. ); echo repertoire courant :.getcwd(). <br> ; 18 g Intérêt Progrès par rapport à la version PHP4 Permet de rassembler autour d un même objet (concept), une définition, des attributs et des méthodes d action de réutiliser des objets existants en les complétant par ce qui est nouveau D où des avantages liés à : La clarté du code La modularité La réutilisabilité L interopérabilité g Création d une classe Déclarer une classe class voiture { //contenu de la classe g Le contenu de la classe est structuré en deux parties La première partie permet de déclarer les attributs et les constantes (à partir du PHP5) Les attributs sont déclarés en utilisant la syntaxe des variables et un des mots-clés suivant : public, private ou protected Les constantes sont des attributs locales à une classe La deuxième partie du contenu d une classe permet la déclaration des méthodes Ces méthodes se déclarent exactement comme des fonctions Exemple class voiture { const Vitesse = 1; public $marque= Ferrari ; function freiner($force_de_freinage){ //instructions pour faire freiner 19 20 5
g Utilisation des objets Instanciation Pour pouvoir utiliser un objet, il faut d abord le créer à partir d une classe On utilise le mot-clé : new Exemple //déclaration de la classe class voiture { public $marque; function freiner($force_de_freinage){ //instructions pour faire freiner //Instance d un objet $mavoiture = new voiture(); Les parenthèses lors de l instanciation sont ici optionnelles. Elles ne seront nécessaires que si on a des paramètres à passer pour l initialisation de l objet 21 g Utilisation d un attribut Une fois qu un objet est instancié, on peut utiliser ses attributs et ses méthodes class CompteBancaire{ public $solde=0; $mon_compte = new CompteBancaire(); echo 'Le solde de mon compte est : '; echo $mon_compte->solde, '<br>'; //Affiche 0 $mon_compte->solde = 6000; echo 'Maintenant le solde de mon compte est :'; echo $mon_compte->solde, '<br>'; //Affiche 6000 22 g Utilisation des méthodes Similaire à celle des attributs Séparer l objet et la méthode par -> class Voiture{ function klaxonne(){ echo "vous klaxonnez fort!"; $ma_voiture = new Voiture(); $ma_voiture->klaxonne(); //affiche vous klaxonnez fort! 23 g Constantes Les constantes s utilisent de manière statique On peut y faire référence de partout dans le code class TondeuseGazon{ const TRACTEE=1; const AUTOPORTEE=2; const POUSSEE=4; public $type; $matondeuse = new TondeuseGazon(); $matondeuse->type = TondeuseGazon::POUSSEE; echo $matondeuse->type; //Affiche 4 24 6
g Constructeur C est une méthode permettant d initialiser un objet à sa création La métavariable $this est Elle porte le nom : _construct() une référence permanente vers l objet courant class voiture{ public $vitesse = 0; public $marque; function affiche(){ echo 'Il s\'agit d\'une voiture de marque'; public $annee; echo $this->marque, '<br>'; public $modele; echo 'Le modèle est ', $this->modele, '<br>'; //Définition du constructeur echo 'L\'année d\'achat est ', $this->annee, '<br>'; function _construct($marque,$modele,$annee){ $ma_voiture = new $this->marque = $marque; voiture('constructeur1','coupesport',2004); $this->annee = $annee; $ma_voiture->affiche(); $this->modele = $modele; function avance($temps) { $distance = $temps * $this->vitesse; echo "Pendant des $temps heures on a avancé de $distance km"; 25 g Destructeur De manière identique, il existe un destructeur, _destruct(), appelé automatiquement quand l objet est détruit, soit par unset(), soit à la fin du script class mere{ function _destruct(){ echo "appel au destructeur de la classe mère <br/>"; class fille extends mere{ function _destruct(){ echo "appel au destructeur de la classe fille <br/>"; parent::_destruct(); $objet = new fille(); $objet ->_destruct(); 26 g Héritage g Héritage Exemple 1 class vehicule_a_moteur{ function avancer (){ echo "J'avance<br>\n"; class voiture extends vehicule_a_moteur { function passer_la_vitesse ($vitesse){ echo "Je passe la vitesse $vitesse<br>\n"; function avancer (){ $this->passer_la_vitesse(1); parent::avancer(); $mavoiture = new voiture(); $mavoiture->avancer(); //Affiche "Je passe la vitesse 1" puis "J'avance" 27 28 7
Bibliographie g Héritage Exemple 2 class vehicule_a_moteur{ public $nombre_roues = 2; class voiture extends vehicule_a_moteur { $berline = new voiture(); echo $berline->nombre_roues; //affiche 2 g A. Belaïd, Programmation web, PHP 5 g http://www.phpdebutant.org g http://php.net/ 29 30 8