La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

1. Sommaire Quest-ce que PHP ? Les structures de base Traitements de base Traitements de chaînes Utilisation des tableaux Fonctions usuelles Formulaires.

Présentations similaires


Présentation au sujet: "1. Sommaire Quest-ce que PHP ? Les structures de base Traitements de base Traitements de chaînes Utilisation des tableaux Fonctions usuelles Formulaires."— Transcription de la présentation:

1 1

2 Sommaire Quest-ce que PHP ? Les structures de base Traitements de base Traitements de chaînes Utilisation des tableaux Fonctions usuelles Formulaires et superglobales Environnement web et superglobales Les cookies et Les sessions Gestion des objets Gestion de chiers Gestion des ux et Flux de sortie PHP Envoyer et recevoir des s Travailler avec une base de données 2

3 Sommaire Erreurs et exceptions XML : concepts et SimpleXML XML avancé Les services web Les templates Les systèmes de cache Gestion des images Expressions régulières Sécurité Outils de développement PHP Les CMS Les frameworks 3

4 Gestion des objets 4 Introduction aux objets Chaque objet a des attributs qui lui sont propres. Mon compte en banque a un attribut qui dénit le numéro de compte, un autre qui dénit le solde actuel, un troisième qui est une liste des différentes opérations, et ainsi de suite. Les attributs peuvent être vus comme les caractéristiques propres de lobjet. Les objets peuvent avoir des méthodes. Il sagit des actions quon peut appliquer à un objet. Toujours en prenant mon objet de compte en banque, il existe une méthode pour le solder, une pour ajouter une écriture, une pour le déplacer dans une autre banque, etc.

5 Gestion des objets 5 Introduction aux objets Une classe est un modèle de données. On peut la voir comme une famille dobjets. Tous les objets dune même classe sont similaires. Ils partagent les mêmes attributs et méthodes. On peut ainsi imaginer une classe représentant les voitures. Toutes les voitures (tous les objets de la classe voiture) ont des plaques dimmatriculation, un moteur avec une certaine puissance et un nombre de portières identiables (ils ont des attributs communs). Tous les objets de cette classe ont aussi des méthodes pour démarrer, freiner, accélérer, tourner, etc.

6 Gestion des objets 6 Introduction aux objets Une instance est une représentation particulière dune classe. Pour donner un exemple, Mégane est une classe et une instance de cette classe pourrait être la voiture que vous venez dacheter, qui est bleue et sans options. Une autre instance de la classe Mégane pourrait être la voiture rouge garée en bas de chez vous. En revanche, il faut faire attention au fait quil peut y avoir plusieurs instances ayant les mêmes propriétés sans quelles soient identiques. Par exemple, si quelquun dautre achète la même voiture que vous, une Mégane bleue sans options, il sagira dune autre instance de la même classe.

7 Gestion des objets 7 Utilisation des objets Le mot-clé class permet de dénir une nouvelle classe. Il doit être suivi du nom de la classe et dun bloc entre accolades. Entre ces accolades pourront être insérés les attributs de la classe et les dénitions des méthodes, ou encore des commentaires.

8 Gestion des objets 8 Utilisation des objets : Constantes La version 5 de PHP permet de dénir des constantes locales à une classe. De telles constantes vous permettent de ne pas polluer lespace global avec des constantes que vous nutilisez que dans le cadre dun certain type dobjet. Une convention classique est de spécier les constantes en majuscules dans le code pour mieux les identier et les isoler.

9 Gestion des objets 9 Utilisation des objets : Instanciation Pour pouvoir utiliser un objet, il faut dabord le créer à partir dun modèle (la classe).

10 Gestion des objets 10 Utilisation des objets : Utilisation dun attribut Une fois quun objet a été instancié, on peut commencer à utiliser ses attributs et ses méthodes. Les attributs sutilisent comme des variables classiques. solde, ' ' ; // Affiche 0 $mon_compte->solde = 6000 ; echo 'Maintenant le solde de mon compte est : '; echo $mon_compte->solde, ' ' ; // Affiche 6000 ?> solde, ' ' ; // Affiche 0 $mon_compte->solde = 6000 ; echo 'Maintenant le solde de mon compte est : '; echo $mon_compte->solde, ' ' ; // Affiche 6000 ?>

11 Gestion des objets 11 Utilisation des objets : Utilisation des méthodes Lappel dune méthode se fait de façon similaire à celui dune fonction. klaxonne () ; // Affiche Vous klaxonnez fort ! ?> klaxonne () ; // Affiche Vous klaxonnez fort ! ?>

12 Gestion des objets 12 Utilisation des objets : Référence à lobjet en cours Il est souvent utile de pouvoir faire référence à lobjet en cours dans une méthode. Cest par exemple le cas pour accéder à un attribut ou lancer une autre méthode. La métavariable $this est une référence permanente vers lobjet courant. vitesse ; echo "Pendant ces $temps heures on a avancé de $distance km" ; } $ma_voiture = new voiture() ; $ma_voiture->vitesse = 100 ; // On avance à 100 km/h echo 'Actuellement notre vitesse est de ' ; echo $ma_voiture->vitesse, 'km/h '; $ma_voiture->avance( 2 ) ; // On avance 2h ?> vitesse ; echo "Pendant ces $temps heures on a avancé de $distance km" ; } $ma_voiture = new voiture() ; $ma_voiture->vitesse = 100 ; // On avance à 100 km/h echo 'Actuellement notre vitesse est de ' ; echo $ma_voiture->vitesse, 'km/h '; $ma_voiture->avance( 2 ) ; // On avance 2h ?>

13 Gestion des objets 13 Utilisation des objets : Constantes daide au débogage À tout moment, dans une méthode, vous pouvez faire appel aux métaconstantes __CLASS__ et __METHOD__. Elles vous retourneront les noms de la classe et de la méthode en cours dexécution. vitesse = 100 ; // On avance à 100 km/h $ma_voiture->avance( 2 ); ?> vitesse = 100 ; // On avance à 100 km/h $ma_voiture->avance( 2 ); ?>

14 Gestion des objets 14 Utilisation des objets : Accès à une constante depuis lextérieur Depuis nimporte où dans le code, vous pouvez faire référence à une constante de la classe xxx grâce à lopérateur xxx::. type = TondeuseGazon::POUSSEE ; echo $maTondeuse->type ; // Affiche le chiffre 4 ?> type = TondeuseGazon::POUSSEE ; echo $maTondeuse->type ; // Affiche le chiffre 4 ?>

15 Gestion des objets 15 Utilisation des objets : Accès à une constante locale À lintérieur dune méthode, il est aussi possible daccéder aux constantes de lobjet en cours grâce à lopérateur self::. type = self::POUSSEE ; } $maTondeuse = new TondeuseGazon() ; $maTondeuse->setTondeusePoussee() ; echo $maTondeuse->type ; // Affiche le chiffre 4 ?> type = self::POUSSEE ; } $maTondeuse = new TondeuseGazon() ; $maTondeuse->setTondeusePoussee() ; echo $maTondeuse->type ; // Affiche le chiffre 4 ?>

16 Gestion des objets 16 Utilisation des objets : Afchage dun objet Quand vous essayez dafcher directement un objet, PHP renvoie le texte « Object ». La version 5 de PHP apporte une méthode particulière nommée __tostring(). Si cette méthode est dénie, le résultat de son appel est afché à la place du texte « Object ».

17 Gestion des objets 17 Utilisation des objets : Vérier le type dun objet Dans vos applications, vous aurez probablement besoin de savoir de quel type est un objet, ou sil appartient à un sous-type dune classe connue. Vous pouvez vérier quun objet spécié appartient à une classe donnée ou à une de ses sous-classes grâce au mot- clé instanceof. class voiture { } $maVoiture = new voiture() ; if ($maVoiture instanceof voiture) { echo "Il sagit dune voiture" ; } else { echo "Il ne sagit pas dune voiture" ; } ?> class voiture { } $maVoiture = new voiture() ; if ($maVoiture instanceof voiture) { echo "Il sagit dune voiture" ; } else { echo "Il ne sagit pas dune voiture" ; } ?>

18 Gestion des objets 18 Utilisation des objets : Vérier le type dun objet Il est possible de connaître la classe exacte dun objet et pas seulement son appartenance à une famille via la fonction get_class(). En fournissant un objet en paramètre, elle renvoie une chaîne de caractères contenant le nom de la classe à laquelle appartient lobjet.

19 Gestion des objets 19 Utilisation des objets : Vérier le type dun objet Il est aussi possible de remonter la hiérarchie des classes et daccéder au nom de la classe parente grâce la fonction get_parent_class(). Vous pouvez lui fournir en paramètre soit un objet, soit un nom de classe.

20 Gestion des objets 20 Copie et référence La version 5 de PHP utilise par défaut laffectation par référence quand il sagit dobjets. Pour simplier, on peut considérer que lopérateur & est toujours présent, implicitement, à chaque fois quun objet est affecté à une variable ou passé à une fonction. montant -= $valeur ; $destination->montant += $valeur ; } $eric = new compte() ; $eric->montant = 100 ; $cyril = new compte() ; $cyril->montant = 100 ; $eric->virer(50, $cyril) ; echo $cyril->montant ; // Affiche 150 ?> montant -= $valeur ; $destination->montant += $valeur ; } $eric = new compte() ; $eric->montant = 100 ; $cyril = new compte() ; $cyril->montant = 100 ; $eric->virer(50, $cyril) ; echo $cyril->montant ; // Affiche 150 ?>

21 Gestion des objets 21 Garder la compatibilité avec PHP 4 Si vous avez une application PHP 4 reposant massivement sur le fonctionnement par copie des objets, vous pouvez demander au moteur de garder lancien comportement en activant dans php.ini la directive de conguration zend.ze1_compatibility_mode. Vous ne pourrez toutefois pas mixer les comportements PHP 4 et PHP 5 dans une même exécution.

22 Gestion des objets 22 La copie explicite dobjet, ou clonage Il peut toutefois être utile de copier volontairement un objet, pour se retrouver avec deux objets distincts ayant des attributs initialement identiques. Pour copier un objet, vous pouvez utiliser le mot-clé clone : nombre ; } $obj1 = new objet() ; $obj1->nombre = 1 ; $obj2 = clone $obj1 ; // On crée une copie, les objets sont alors identiques mais ne sont pas les mêmes $obj2->nombre = 2 ; echo $obj1->nombre ; // Affiche 1 // La modification de lobjet 2 na pas affecté lobjet 1 ?> nombre ; } $obj1 = new objet() ; $obj1->nombre = 1 ; $obj2 = clone $obj1 ; // On crée une copie, les objets sont alors identiques mais ne sont pas les mêmes $obj2->nombre = 2 ; echo $obj1->nombre ; // Affiche 1 // La modification de lobjet 2 na pas affecté lobjet 1 ?>

23 Gestion des objets 23 La copie explicite dobjet, ou clonage Vous pouvez redénir le comportement du mot-clé clone en dénissant une méthode __clone() dans votre classe. Cela peut par exemple être utile pour gérer des ressources comme des descripteurs de chiers, des connexions vers des bases de données, des identiants uniques, etc. compte = 10 ; } $original = new test() ; $copie = clone $original ; echo $copie->compte ; // Affiche 10 ?> compte = 10 ; } $original = new test() ; $copie = clone $original ; echo $copie->compte ; // Affiche 10 ?>

24 Gestion des objets 24 Égalité et identité Lutilisation des copies et des références peut amener à des erreurs simples lors des tests dégalité. Il faut bien faire attention à ce que lon veut : soit tester légalité (tous les attributs sont égaux) ; soit tester lidentité (les deux variables référencent le même objet). Légalité est testée par == ; lidentité est testée par ===

25 Gestion des objets 25 Constructeurs et destructeurs PHP prévoit un moyen dinitialiser un objet à sa création. Il sagit dexécuter une méthode spécique [__construct()] lors de la création de lobjet. On parle de constructeur. marque = $marque; $this->annee = $annee; $this->modele = $modele; } marque = $marque; $this->annee = $annee; $this->modele = $modele; } function avance( $temps ) { // Définition de la fonction avance $distance = $temps * $this->vitesse ; echo "Pendant ces $temps H on a avancé de $distance km" ; } function affiche( ) {// Définition de la fonction afficher echo 'Il s\'agit d\'une voiture de marque ' ; echo $this->marque, ' '; echo 'Le modèle est ', $this->modele, ' '; echo 'L\'année d\'achat est ', $this->annee, ' '; } $ma_voiture = new voiture('Renault','clio',2004) ; $ma_voiture->affiche(); ?> function avance( $temps ) { // Définition de la fonction avance $distance = $temps * $this->vitesse ; echo "Pendant ces $temps H on a avancé de $distance km" ; } function affiche( ) {// Définition de la fonction afficher echo 'Il s\'agit d\'une voiture de marque ' ; echo $this->marque, ' '; echo 'Le modèle est ', $this->modele, ' '; echo 'L\'année d\'achat est ', $this->annee, ' '; } $ma_voiture = new voiture('Renault','clio',2004) ; $ma_voiture->affiche(); ?>

26 Gestion des objets 26 Constructeurs et destructeurs De la même manière quil existe un constructeur, on peut dénir un destructeur. Il sagit dune méthode nommée __destruct(). Elle est automatiquement appelée quand lobjet est détruit, soit par delete() ou unset(), soit à la n du script. $objet = new fille() ; unset($fille) ; // Affiche // appel au destructeur de la classe fille // appel au destructeur de la classe mère ?>

27 Gestion des objets 27 La notion dhéritage Assez souvent, plusieurs classes partagent elles-mêmes certains de leurs attributs et méthodes. On peut parler de catégories dobjets et de sous-catégories. Il est possible dexpliquer cette relation avec la notion dhéritage. Ainsi, lobjet qui dénit ma voiture appartient à la classe des voitures, qui elle-même dérive de la classe des véhicules à moteur. On dit alors que la classe des voitures hérite de la classe des véhicules à moteur : elle peut en utiliser les méthodes et les attributs. Pour le langage PHP, une classe ne peut hériter que dune seule classe. Lhéritage multiple est interdit

28 Gestion des objets 28 La notion dhéritage Dans lexemple, la classe des voitures hérite de la classe des véhicules à moteur. public function avance($temps=NULL){ // Code pour voiture.avance... } public function freine($temps=NULL){ // Code pour voiture.freine... } public function demarre(){ // Code pour voiture.demarre... } ?>

29 Gestion des objets 29 Redénition dattribut ou de méthode Si un attribut est redéni, cest sa dernière dénition qui est utilisée pour déterminer la valeur par défaut de lobjet de la classe lle : nombre_roues ; // Affiche 4 ?> nombre_roues ; // Affiche 4 ?> nombre_de_roues() ; // Affiche 4 ?> nombre_de_roues() ; // Affiche 4 ?>

30 Gestion des objets 30 Accès aux méthodes parentes Si une méthode est redénie dans la classe lle, il peut être utile de volontairement appeler la méthode de la classe parente. Il suft alors dutiliser une notation statique avec le mot-clé parent. La syntaxe parent::xxx() permet daccéder à la méthode xxx de la classe mère. passer_la_vitesse(1) ; parent::avancer() ; } $maVoiture = new voiture() ; $maVoiture->avancer() ; // Affiche "Je passe la vitesse 1" puis "Javance" ?> function avancer() { $this->passer_la_vitesse(1) ; parent::avancer() ; } $maVoiture = new voiture() ; $maVoiture->avancer() ; // Affiche "Je passe la vitesse 1" puis "Javance" ?>

31 Gestion des objets 31 Sûreté de programmation : Contrôle daccès Le contrôle daccès est une fonctionnalité qui permet de ltrer les accès aux attributs et aux méthodes. Une méthode (ou attribut) publique est accessible depuis toute votre application. Vous pouvez le préciser explicitement en utilisant le mot-clé public devant les attributs et méthodes dans la déclaration de la classe Une méthode (ou attribut) en accès privé nest utilisable quà lintérieur même de la classe. Il est interdit dy faire appel à partir de lextérieur. Le mot-clé à utiliser est private. Un accès protégé est une solution intermédiaire entre un accès privé et un accès public. Il est toujours interdit de faire appel à une méthode ou à un attribut protégé depuis lextérieur de lobjet, mais la méthode (ou lattribut) est utilisable par les classes dérivées. Le mot-clé pour un accès protégé est protected.

32 Gestion des objets 32 Sûreté de programmation : Contrôle daccès class vehicule_a_moteur { protected $vitesse = 30 ; private $roues = 4 ; } class voiture extends vehicule_a_moteur { public function avancer() { echo "J'avance à la vitesse de " ; echo $this->vitesse, " km/h \n" ; // Appel autorisé car on est à lintérieur dune classe dérivée } public function nombreRoues() { echo "il y a ", $this->roues, "\n" ; // Appel interdit, le nombre de roues est privé } $maVoiture = new voiture() ; $maVoiture->avancer() ; // Affiche "Javance à la vitesse de 30km/h" $maVoiture->nombreRoues() ; // Génère une erreur fatale car la méthode essaie daccéder à un attribut privé class vehicule_a_moteur { protected $vitesse = 30 ; private $roues = 4 ; } class voiture extends vehicule_a_moteur { public function avancer() { echo "J'avance à la vitesse de " ; echo $this->vitesse, " km/h \n" ; // Appel autorisé car on est à lintérieur dune classe dérivée } public function nombreRoues() { echo "il y a ", $this->roues, "\n" ; // Appel interdit, le nombre de roues est privé } $maVoiture = new voiture() ; $maVoiture->avancer() ; // Affiche "Javance à la vitesse de 30km/h" $maVoiture->nombreRoues() ; // Génère une erreur fatale car la méthode essaie daccéder à un attribut privé

33 Gestion des objets 33 Sûreté de programmation : Contrôle daccès Lutilisation ou non des contrôles daccès est un choix que vous devez faire au début de votre projet. Globalement, ces syntaxes permettent de repérer facilement les erreurs daccès à certains composants. Ces fonctionnalités sont particulièrement utiles lors dun développement à plusieurs ou lors de la programmation dune brique logicielle. Marquer explicitement des méthodes ou des attributs comme privés ou protégés permet de dissuader lutilisateur de ces objets daccéder à des détails dimplémentation qui peuvent changer par la suite.

34 Gestion des objets 34 Sûreté de programmation : Typage Il est possible de renforcer les contrôles sur les objets en donnant des informations de types sur les paramètres des méthodes. Il est en effet possible de dire à PHP de naccepter quun type dobjet bien précis comme paramètre. Il suft alors de préxer le paramètre par le nom de la classe souhaitée. marque ; } $maVoiture = new voiture() ; $autreVoiture = new voiture() ; $maVoiture->faireUnAccidentAvec( $autreVoiture ) ; // Affiche Il y a eu un accident avec une voiture Fiat $maVoiture->faireUnAccidentAvec( 'Fiat' ) ; // Provoque une erreur car 'Fiat' // nest pas un objet de type voiture, ni un sous-type de voiture ?> marque ; } $maVoiture = new voiture() ; $autreVoiture = new voiture() ; $maVoiture->faireUnAccidentAvec( $autreVoiture ) ; // Affiche Il y a eu un accident avec une voiture Fiat $maVoiture->faireUnAccidentAvec( 'Fiat' ) ; // Provoque une erreur car 'Fiat' // nest pas un objet de type voiture, ni un sous-type de voiture ?>

35 Gestion des objets 35 Sûreté de programmation : Classes abstraites Une classe abstraite est un début dimplémentation dune classe. On dénit certaines méthodes et attributs en obligeant les classes dérivées à les implémenter. On peut ainsi présenter un début dimplémentation et forcer les gens qui la réutilisent à létendre en la complétant. Une classe contenant une méthode abstraite (ou plusieurs) doit être déclarée comme abstraite. Si ce nest pas le cas, PHP renvoie une erreur. abstract class vehicule { abstract function avancer(); abstract function arreter(); } $test = new vehicule() ; // Provoque une erreur fatale, on essaye dinstancier une classe abstraite directement class voiture extends vehicule { function avancer() { echo 'on avance' ; } } // Provoque une erreur fatale car la classe voiture nimplémente rien pour sarrêter et nest pas notée abstraite abstract class vehicule { abstract function avancer(); abstract function arreter(); } $test = new vehicule() ; // Provoque une erreur fatale, on essaye dinstancier une classe abstraite directement class voiture extends vehicule { function avancer() { echo 'on avance' ; } } // Provoque une erreur fatale car la classe voiture nimplémente rien pour sarrêter et nest pas notée abstraite

36 Gestion des objets 36 Sûreté de programmation : Interfaces La notion dinterface est proche de celle de classe abstraite, mais un peu plus générique. Il sagit de dénir une API (Application Programming Interface) qui sera utilisée par un composant. Tous les objets qui passeront par ce composant devront, pour que lapplication fonctionne, proposer cette interface. On déclare une interface de manière similaire à une classe abstraite mais avec le mot-clé interface. Les méthodes sont forcément publiques. On peut déclarer une classe comme implémentant une certaine interface grâce au mot- clé implements. Il est possible dimplémenter plusieurs interfaces en les séparant par des virgules.

37 Gestion des objets 37 Sûreté de programmation : Interfaces interface faitDeLaLumiere { function allumer() ; function eteindre() ; } class voiture implements peutAvancer, faitDeLaLumiere { function avancer() { echo 'on avance' ; } function arreter() { echo 'on arrete' ; } function allumer() { echo 'les phares sont allumés' ; } function eteindre() { echo 'les phares sont éteints' ; } interface faitDeLaLumiere { function allumer() ; function eteindre() ; } class voiture implements peutAvancer, faitDeLaLumiere { function avancer() { echo 'on avance' ; } function arreter() { echo 'on arrete' ; } function allumer() { echo 'les phares sont allumés' ; } function eteindre() { echo 'les phares sont éteints' ; }

38 Gestion des objets 38 Sûreté de programmation : Interfaces De même que pour les classes abstraites, si une classe implémente seulement une partie des interfaces, elle doit être spéciée comme abstraite pour ne pas provoquer une erreur fatale. Ni cette classe abstraite ni linterface ne peuvent être instanciées : il faut déclarer une classe complète, implémentant toutes les méthodes des interfaces. Les interfaces sont utilisées pour déclarer quun objet se conforme à un certain comportement, ou quil peut gérer un certain type dévénements et de fonctionnalités.

39 Gestion des objets 39 Sûreté de programmation : Classes et méthodes nales Le concept de méthodes nales est lopposé de celui de méthodes abstraites. Il sagit de déclarer à PHP quaucune classe dérivée na le droit de modier limplémentation de la méthode. Une classe dérivée essayant de déclarer une méthode au même nom provoquera une erreur fatale. Le mot-clé à ajouter devant la méthode est final. Il est de la même façon possible de dénir une classe comme nale. Elle ne pourra alors plus être dérivée, toute limplémentation est considérée comme bloquée. class voiture extends vehicule { final function avancer() { echo 'on avance' ; } final class voiture extends vehicule { function avancer() { echo 'on avance' ; } class voiture extends vehicule { final function avancer() { echo 'on avance' ; } final class voiture extends vehicule { function avancer() { echo 'on avance' ; }

40 Gestion des objets 40 Accès statiques : Accès à une classe arbitraire On appelle un accès statique à une méthode ou à un attribut un appel direct à la classe, sans instancier dobjet. class voiture { public $roues = 4 ; function classique() { return $this->roues ; } function statique() { return 4 ; } // Accès statique echo voiture::statique() ; // Affiche 4 echo voiture::classique() ; // Naffiche rien, génère une erreur // Accès classique $mavoiture = new voiture() ; echo $mavoiture->classique() ; // Affiche 4 class voiture { public $roues = 4 ; function classique() { return $this->roues ; } function statique() { return 4 ; } // Accès statique echo voiture::statique() ; // Affiche 4 echo voiture::classique() ; // Naffiche rien, génère une erreur // Accès classique $mavoiture = new voiture() ; echo $mavoiture->classique() ; // Affiche 4

41 Gestion des objets 41 Accès statiques : Dénition en vue dun accès statique Il est possible de déclarer explicitement une méthode ou un attribut comme statique. Ils ne seront alors appelables que statiquement. Il vous suft de préxer la déclaration par le mot-clé static.

42 Gestion des objets 42 Accès statiques : Accès à la classe en cours Lors dun appel statique, on perd tout contexte. Il nest plus possible dutiliser une syntaxe comme $this->methode(). Il peut être toutefois intéressant de référencer une autre méthode (ou un autre attribut) statique de la même classe. Pour ce faire, vous pouvez utiliser le mot-clé self, il désigne la classe en cours (à différencier de $this qui référence lobjet en cours).

43 Gestion des objets 43 Accès statiques : Accès à la classe parente Utiliser lopérateur parent:: permet daccéder aux méthodes parentes. Si vous êtes dans le contexte dun objet, lappel statique à la classe parente ne fait pas disparaître le $this. class vehicule { public function affiche() { echo 'Il y a ', $this->roues, ' roues' ; } class voiture extends vehicule { public $roues = 4 ; public $portieres = 2 ; public function affiche() { parent::affiche() ; echo ' et ', $this->portieres, ' portières' ; } $maVoiture = new voiture() ; $maVoiture->affiche() ; // Affiche Il y a 4 roues et 2 portières class vehicule { public function affiche() { echo 'Il y a ', $this->roues, ' roues' ; } class voiture extends vehicule { public $roues = 4 ; public $portieres = 2 ; public function affiche() { parent::affiche() ; echo ' et ', $this->portieres, ' portières' ; } $maVoiture = new voiture() ; $maVoiture->affiche() ; // Affiche Il y a 4 roues et 2 portières

44 Gestion des objets 44 Chargement automatique Pour faciliter lutilisation des objets, PHP 5 propose un système de chargement automatique. Si vous tentez dinstancier un objet dune classe inexistante, PHP va chercher une fonction nommée __autoload(). Si cette fonction est présente, elle est appelée avec le nom de la classe manquante en paramètre ; charge à elle de déclarer la classe ou de charger le chier PHP contenant sa dénition. function __autoload( $nom_de_classe ) { require_once( 'lib/'.$nom_de_classe.'.class.php' ) ; } $objet = new MaClasse() ; function __autoload( $nom_de_classe ) { require_once( 'lib/'.$nom_de_classe.'.class.php' ) ; } $objet = new MaClasse() ;

45 Gestion des objets 45 Surcharge : Affectations des attributs PHP dénit trois méthodes dites de surcharge. Il sagit dintercepter les appels à des attributs ou à des méthodes non dénis. Ces trois méthodes vous permettent de répondre à PHP comme si la méthode ou lattribut existait. Si votre classe implémente une méthode __set(), cette méthode sera appelée à chaque fois quon essaye daffecter une valeur à un attribut inexistant. Cette méthode doit accepter deux paramètres, le nom de lattribut et sa valeur. valeurs[$nom] = $valeur ; } $monObjet = new maClasse() ; $monObjet->propriete = 'texte' ; // Affiche on essaie de mettre 'texte' dans propriete ?> valeurs[$nom] = $valeur ; } $monObjet = new maClasse() ; $monObjet->propriete = 'texte' ; // Affiche on essaie de mettre 'texte' dans propriete ?>

46 Gestion des objets 46 Surcharge : Lecture dattribut (Mutator) Parallèlement à __set(), il existe un __get(). Si vous limplémentez, cette méthode sera appelée à chaque fois quon essayera de lire un attribut inexistant dans un objet de la classe. Elle prend un paramètre qui dénit le nom de lattribut auquel on essaye daccéder. La valeur de retour de __get() sera utilisée par PHP comme valeur de lattribut, comme sil existait. valeurs[$nom] = $valeur ; } public function __get($nom) { echo "on essaie de lire $nom \n" ; return $this->valeurs[$nom] ; } valeurs[$nom] = $valeur ; } public function __get($nom) { echo "on essaie de lire $nom \n" ; return $this->valeurs[$nom] ; } $monObjet = new maClasse() ; $monObjet->propriete = 'texte' ; echo $monObjet->propriete ; // Affiche // On essaie de mettre 'texte' dans propriete // On essaie de lire propriete // texte ?> $monObjet = new maClasse() ; $monObjet->propriete = 'texte' ; echo $monObjet->propriete ; // Affiche // On essaie de mettre 'texte' dans propriete // On essaie de lire propriete // texte ?>

47 Gestion des objets 47 Surcharge : Appel dune méthode (Accessor) De manière similaire à __get() et __set(), la méthode __call() intercepte les appels aux méthodes inexistantes. La méthode reçoit deux paramètres : le nom de la méthode et un tableau de paramètres. PHP répercutera la valeur de retour comme si elle venait de la méthode appelée et non de la fonction de surcharge. longueur('texte') ; // Affiche // On essaie dappeler longueur avec 'texte' // longueur : 5 ?> longueur('texte') ; // Affiche // On essaie dappeler longueur avec 'texte' // longueur : 5 ?>

48 Gestion des objets 48 Itérateurs : Utilisation simple Utiliser un objet avec foreach() est en fait très simple. Il vous suft pour cela dimplémenter linterface Iterator. Dès lors, PHP pourra traverser votre objet avec foreach() comme sil sagissait dun tableau. Votre objet pourra alors retourner une liste de couples clé/valeur lisible par PHP. Linterface Iterator vous impose dimplémenter les quelques méthodes nécessaires à PHP pour récupérer les couples clé/valeur pour retourner les éléments à PHP : current(), key(), next(), valid() et rewind(). On considère quil existe une sorte de curseur qui pointe sur un élément de la liste. Ces méthodes permettent soit de récupérer lélément pointé par le curseur, soit de déplacer le curseur sur un autre élément.

49 Gestion des objets 49 Itérateurs : Utilisation simple login[$this->index]; } public function next() { $this->index += 1 ; } public function valid() { return ($this->index +1 login)) ; } public function key() { return $this->uid[$this->index]; } login[$this->index]; } public function next() { $this->index += 1 ; } public function valid() { return ($this->index +1 login)) ; } public function key() { return $this->uid[$this->index]; } public function rewind() { $this->index = 0 ; } public function ajouteUtilisateur($uid, $login) { $this->login[] = $login ; $this->uid[] = $uid ; } $liste = new listeUtilisateur() ; $liste->ajouteUtilisateur(101, 'ganf') ; $liste->ajouteUtilisateur(102, 'cyruss') ; $liste->ajouteUtilisateur(103, 'roms') ; $liste->ajouteUtilisateur(104, 'gildas') ; foreach($liste as $uid => $login) { echo "Utilisateur n˚ $uid : $login " ; } public function rewind() { $this->index = 0 ; } public function ajouteUtilisateur($uid, $login) { $this->login[] = $login ; $this->uid[] = $uid ; } $liste = new listeUtilisateur() ; $liste->ajouteUtilisateur(101, 'ganf') ; $liste->ajouteUtilisateur(102, 'cyruss') ; $liste->ajouteUtilisateur(103, 'roms') ; $liste->ajouteUtilisateur(104, 'gildas') ; foreach($liste as $uid => $login) { echo "Utilisateur n˚ $uid : $login " ; }

50 Gestion des objets 50 Itérateurs : Utilisation complète Avoir toute linterface ditération dans lobjet nest pas forcément pratique. PHP donne la possibilité à votre classe de retourner un objet qui servira dinterface pour foreach(). Si votre classe implémente linterface IteratorAggregate, elle devra implémenter une méthode getIterator(). Cette méthode doit retourner un objet implémentant linterface Iterator et qui sera utilisé au nal par foreach().

51 Gestion des objets 51 Itérateurs : Utilisation complète couleurs[] = $couleur ; } function getIterator() { $iterator = new GroupeCouleursIterator($this->couleurs) ; return $iterator ; } class GroupeCouleursIterator implements Iterator { private $array = array() ; private $key ; private $current ; function __construct( $array ) { $this->array = $array ; } couleurs[] = $couleur ; } function getIterator() { $iterator = new GroupeCouleursIterator($this->couleurs) ; return $iterator ; } class GroupeCouleursIterator implements Iterator { private $array = array() ; private $key ; private $current ; function __construct( $array ) { $this->array = $array ; } function rewind() { reset($this->array); $this->next(); } function valid() { return $this->key !== NULL; } function key() { return $this->key; } function current() { return $this->current; } function next() { list($key, $current) = each($this->array); $this->key = $key; $this->current = $current; } } $couleurs = new GroupeCouleurs() ; $couleurs->ajouteCouleur('bleu') ; $couleurs->ajouteCouleur('vert') ; $couleurs->ajouteCouleur('rouge') ; $couleurs->ajouteCouleur('jaune') ; echo "Couleurs :" ; foreach( $couleurs as $couleur ) { echo " $couleur" ; } // Affiche // Couleurs : bleu vert rouge jaune function rewind() { reset($this->array); $this->next(); } function valid() { return $this->key !== NULL; } function key() { return $this->key; } function current() { return $this->current; } function next() { list($key, $current) = each($this->array); $this->key = $key; $this->current = $current; } } $couleurs = new GroupeCouleurs() ; $couleurs->ajouteCouleur('bleu') ; $couleurs->ajouteCouleur('vert') ; $couleurs->ajouteCouleur('rouge') ; $couleurs->ajouteCouleur('jaune') ; echo "Couleurs :" ; foreach( $couleurs as $couleur ) { echo " $couleur" ; } // Affiche // Couleurs : bleu vert rouge jaune

52 Gestion des objets 52 Notations dindex De la même façon que les itérateurs avec foreach(), il est possible dintégrer les objets avec les syntaxes de tableau, plus exactement la notation $variable[index]. Pour obtenir ce fonctionnement, vous devez implémenter linterface ArrayAccess dans la classe concernée. Cette interface vous impose la dénition de quatre méthodes : offsetExists() dénit si une valeur existe à lindex spécié en paramètre ; elle renvoie TRUE si cest le cas, FALSE sinon. La méthode offsetGet() permet de lire une valeur en spéciant son index ; offsetSet() fait lopération inverse et affecte la valeur en second paramètre à lindex fourni en premier. Finalement offsetUnset() permet deffacer un élément à partir de son index.

53 Gestion des objets 53 Notations dindex tableau[$index] ) ; } function offsetGet( $index ) { return $this->tableau[$index] ; } function offsetSet( $index, $valeur ) { return $this->tableau[ $index ] = $valeur ; } function offsetUnset( $index ) { unset( $this->tableau[ $index ] ) ; } tableau[$index] ) ; } function offsetGet( $index ) { return $this->tableau[$index] ; } function offsetSet( $index, $valeur ) { return $this->tableau[ $index ] = $valeur ; } function offsetUnset( $index ) { unset( $this->tableau[ $index ] ) ; } $tab = new tableau() ; if ( !isset($tab[42]) ) { $tab[42] = 'texte' ; } echo $tab[42] ; // Affiche texte unset( $tab[42] ) ; $tab = new tableau() ; if ( !isset($tab[42]) ) { $tab[42] = 'texte' ; } echo $tab[42] ; // Affiche texte unset( $tab[42] ) ;

54 Gestion des objets 54 Notations dindex : Auto-incrémentation Lauto-incrémentation (et la décrémentation) est un cas particulier. PHP lit la valeur et lincrémente dans la foulée, sans repasser par la méthode daffectation. Pour pouvoir utiliser ces syntaxes, il faut que la méthode offsetGet() renvoie la valeur par référence et non par copie. Dans le cas contraire, PHP retourne une erreur.

55 Gestion des objets 55 Notations dindex : Auto-incrémentation tableau[$index] ) ; } function &offsetGet( $index ) { // Notez le & devant le nom de la fonction return $this->tableau[$index] ; } function offsetSet( $index, $valeur ) { return $this->tableau[ $index ] = $valeur ; } function offsetUnset( $index ) { unset( $this->tableau[ $index ] ) ; } tableau[$index] ) ; } function &offsetGet( $index ) { // Notez le & devant le nom de la fonction return $this->tableau[$index] ; } function offsetSet( $index, $valeur ) { return $this->tableau[ $index ] = $valeur ; } function offsetUnset( $index ) { unset( $this->tableau[ $index ] ) ; } $tab = new tableau() ; if ( !isset($tab[42]) ) { $tab[42] = 1 ; } echo ++$tab[42] ; // Affiche 2 unset( $tab[42] ) ; $tab = new tableau() ; if ( !isset($tab[42]) ) { $tab[42] = 1 ; } echo ++$tab[42] ; // Affiche 2 unset( $tab[42] ) ;

56 Gestion des objets 56 Introspection Lintrospection (reection en anglais) permet dinspecter du code pendant son exécution. Il est alors possible de connaître les différentes méthodes disponibles pour un objet, de connaître les classes parentes, les attributs, etc. Outre la phase de découverte, il est possible de manipuler tous ces objets trouvés : appeler une méthode par exemple. On sen sert principalement dans deux cas : Lexploration de classes internes du système comme celles qui composent les extensions mysqli ou simplexml. Lutilisation des classes et des méthodes de manière hautement dynamique : par exemple décider lors de lexécution si vous souhaitez appeler la méthode A ou la méthode B. Cest particulièrement intéressant pour gérer des greffons et découvrir leurs fonctionnalités de manière dynamique.

57 Gestion des objets 57 Introspection : Les différents objets à manipuler PHP dénit une classe par objet quon peut manipuler via lintrospection : ReflectionFunction fait référence à une fonction ; ReflectionClass à une classe ; ReflectionException à une exception ; ReflectionObject à une instance de classe (un objet) ; ReflectionProperty à un attribut dans un objet ; ReflectionMethod à une méthode ; ReflectionParameter à un paramètre de fonction ou de méthode ; ReflectionExtension à une extension de PHP.

58 Gestion des objets 58 Introspection : Instanciation et premier export Pour décrire le contenu dun objets, on utilise la méthode statique export() de la classe reflection :

59 Gestion des objets 59 Introspection : Nom et emplacement dune fonction dans les sources getName(). " \n"; echo 'Elle est définie dans le fichier '. $fct->getFileName() ; echo ' entre les lignes '. $fct->getStartLine() ; echo ' et '. $fct->getEndLine() ; ?> getName(). " \n"; echo 'Elle est définie dans le fichier '. $fct->getFileName() ; echo ' entre les lignes '. $fct->getStartLine() ; echo ' et '. $fct->getEndLine() ; ?>

60 Gestion des objets 60 Introspection : Implémentation dune fonction returnsReference())?'oui':'non' ). " \n" ; echo 'Liste des variables statiques : ' ; echo implode( ', ', array_keys( $fct->getStaticVariables() )); ?> returnsReference())?'oui':'non' ). " \n" ; echo 'Liste des variables statiques : ' ; echo implode( ', ', array_keys( $fct->getStaticVariables() )); ?>

61 Gestion des objets 61 Introspection : Exécution de la fonction invoke(0, 1) ; echo $fct->invoke() ; invoke(0, 1) ; echo $fct->invoke() ; Il est possible dexécuter une fonction décrite par les objets dintrospection. Il suft dexécuter la méthode invoke() avec les mêmes paramètres que si vous aviez utilisé la fonction directement.

62 Gestion des objets 62 Introspection : Les objets, classes et interfaces getName(). " \n"; echo 'Elle est définie dans le fichier '. $fct->getFileName() ; echo ' entre les lignes '. $fct->getStartLine(); echo ' et '. $fct->getEndLine() ; getName(). " \n"; echo 'Elle est définie dans le fichier '. $fct->getFileName() ; echo ' entre les lignes '. $fct->getStartLine(); echo ' et '. $fct->getEndLine() ; On instancie la classe ReflectionClass en passant au constructeur le nom de la classe à explorer en unique argument. Lobjet renvoyé nous permettra dobtenir des informations sur la classe en question. Les interfaces sont gérées comme des classes spéciales et peuvent donc être utilisées de la même manière. Les méthodes getName(), getStartLine(), getEndLine(), getFileName(), isUserDefined() et isInternal() fonctionnent de la même manière que pour la description des fonctions.

63 Gestion des objets 63 Introspection : Les objets, classes et interfaces isSubClassOf('test')) { echo "La classe maclassetest est dérivée de la classe test" ; } elseif( ! $fct->getParentClass() ) { echo "La classe maclassetest n'a aucune classe parent" ; } isSubClassOf('test')) { echo "La classe maclassetest est dérivée de la classe test" ; } elseif( ! $fct->getParentClass() ) { echo "La classe maclassetest n'a aucune classe parent" ; } La méthode getParentClass() permet daccéder au nom de la classe parent sil y en a une. Vous pouvez aussi tester si la classe explorée est ou non une classe dérivée dune classe X donnée via la méthode isSubClassOf(). Les méthodes isAbstract() et isFinal() retourneront chacune vrai ou faux selon que la classe explorée est ou non une classe abstraite ou une classe nale. La méthode isInterface() vous permettra de vérier sil sagit dune interface.

64 Gestion des objets 64 Introspection : Les objets, classes et interfaces getName(). " \n"; echo 'Elle est définie dans le fichier '. $fct->getFileName() ; echo ' entre les lignes '. $fct->getStartLine(). ' et '. $fct->getEndLine() ; getName(). " \n"; echo 'Elle est définie dans le fichier '. $fct->getFileName() ; echo ' entre les lignes '. $fct->getStartLine(). ' et '. $fct->getEndLine() ; La liste des différentes méthodes accessibles pour la classe explorée peut être obtenue avec getMethods(). Il est possible de récupérer un objet décrivant le constructeur avec la méthode getConstructor(). Les méthodes getProperty() et getProperties() permettent daccéder à un attribut de la classe ou à tous ses attributs. Les méthodes getConstant() et getConstants() permettent elles daccéder aux constantes.

65 Gestion des objets 65 Introspection : Les objets, classes et interfaces Les méthodes isPrivate(), isProtected() et isPublic() retournent chacune un booléen qui permet de savoir respectivement si la méthode est une méthode privée, protégée ou publique. De même, isStatic() permet de vérier si la méthode est déclarée comme statique, isFinal() et isAbstract() servent elles à voir si la méthode est nale ou abstraite. Les méthodes isConstructor() et isDestructor() retournent vrai si la méthode est respectivement un constructeur de classe ou un destructeur, faux dans le cas contraire.

66 Gestion des objets 66 Coupler PHP et UML Lutilisation de la programmation orientée objet tend souvent à la construction dapplications complexes dans lesquelles le besoin doutils facilitant la compréhension de lapplication est nécessaire. Loutil généralement reconnu pour remplir ce rôle est UML. Il sagit dun langage graphique de représentation des processus informatiques, et en particulier des applications orientées objet.

67 Gestion des objets 67 Coupler PHP et UML : WaterProof ::UML WaterProof::UML est un logiciel commercial de modélisation UML dédié à PHP. Il vous propose de travailler sur une vue graphique de votre application en utilisant les diagrammes de classes du standard UML, ceci avec efcacité et en toute simplicité. Pour ce faire, il propose deux approches complémentaires. Vous pouvez lutiliser sur un nouveau projet en commençant par modéliser votre application en dénissant vos interfaces, classes, attributs, opérations, attributs et liens dhéritage. Au fur et à mesure que votre diagramme se complète, vous avez en temps réel des aperçus du code correspondant à vos éléments. Vous pouvez générer, quand vous le souhaitez, tout le code correspondant à votre application.

68 68

69 Gestion des objets 69 Coupler PHP et UML : WaterProof ::UML WaterProof::UML vous propose également une fonctionnalité inédite de rétro-ingénierie de code PHP. Cela vous permet de reconstruire le diagramme de classe correspondant au code de lapplication, ce qui savère très pratique quand vous devez travailler sur une application que vous ne connaissez pas ou sur laquelle vous avez travaillé plusieurs mois auparavant. En effet, vous allez pouvoir explorer toutes les classes de lapplication de façon visuelle en consultant très facilement la documentation de chacun des éléments présents.

70 Gestion de chiers 70 Fonctions daccès rapide Il existe plusieurs fonctions permettant de lire tout un chier en une passe. La plus simple est file_get_contents(). Elle prend en argument ladresse du chier et retourne une chaîne de caractères avec lintégralité du contenu. Si vous souhaitez afcher directement le contenu au lieu de le traiter comme une chaîne de caractères, vous pouvez utiliser la fonction readfile(). Dans ces deux fonctions, vous pouvez spécier un booléen comme second argument optionnel. Sil est évalué à TRUE et si ladresse du chier est une adresse relative, alors le chier sera cherché à partir de tous les chemins fournis dans la directive de conguration include_path.

71 Gestion de chiers 71 Fonctions daccès rapide Il existe de plus une fonction similaire à readfile(), mais qui opère sur un chier déjà ouvert avec fopen(). La fonction fpassthru() lit lintégralité du chier à partir de la position actuelle et en envoie le contenu vers lafchage. Lunique argument de cette fonction est le descripteur de chier retourné par fopen() à louverture.

72 Gestion de chiers 72 Fonctions daccès rapide La fonction file(), quant à elle, prend en argument une adresse de chier et retourne le contenu dans un tableau ligne à ligne. Les caractères de n de ligne sont gardés et non éliminés dans lopération. Tous les éléments du tableau, sauf éventuellement le dernier, contiennent donc un caractère de n de ligne comme dernier caractère.

73 Gestion de chiers 73 Lecture des chiers de conguration type PHP vous offre un moyen simple dutiliser des chiers de conguration classique de syntaxe similaire au php.ini (les chiers de conguration de Windows sont pour la plupart à ce format). Dans lexemple suivant, nous vous présentons le début du chier mirc.ini : [text] accept=*.bmp,*.gif,*.jpg,*.log,*.mid,*.png,*.txt,*.wav,*.zip ignore=*.exe,*.com,*.bat,*.dll,*.ini,*.vbs,*.js,*.htm,*.html network=Undernet commandchar=/ linesep=- timestamp=[HH:nn] theme=mIRC Classic ;Les commentaires commencent par un point virgule [dirs] logdir=logs\ [text] accept=*.bmp,*.gif,*.jpg,*.log,*.mid,*.png,*.txt,*.wav,*.zip ignore=*.exe,*.com,*.bat,*.dll,*.ini,*.vbs,*.js,*.htm,*.html network=Undernet commandchar=/ linesep=- timestamp=[HH:nn] theme=mIRC Classic ;Les commentaires commencent par un point virgule [dirs] logdir=logs\

74 Gestion de chiers 74 Lecture des chiers de conguration type La fonction parse_ini_file() prend en paramètre ladresse dun tel chier et retourne son contenu sous forme dun tableau associatif. Si vous fournissez TRUE comme deuxième paramètre (optionnel) vous obtiendrez un tableau à deux dimensions, la première étant le nom de la section (valeurs entre crochets dans le chier de conguration) et la deuxième les associations clé/valeur contenues dans cette section.

75 Gestion de chiers 75 Lecture des chiers de conguration type

76 Gestion de chiers 76 Lecture des chiers de conguration type

77 Gestion de chiers 77 Exploiter un chier de tableur (CSV) Les chiers CSV sont un format standard déchange pour les tableurs. Il sagit simplement dun tableau à deux dimensions représenté dans un chier. Habituellement, le séparateur de la première dimension (les lignes) est le caractère de n de ligne et celui de deuxième dimension (les colonnes) est la virgule. Les chaînes de texte sont généralement délimitées par des guillemets an de ne pas interférer avec les virgules. "N˚","Titre","Nb pages","V 1","Relectures","Cas d'applications" 1,"Qu'est ce que PHP ?",28,1,1,"NA" "N˚","Titre","Nb pages","V 1","Relectures","Cas d'applications" 1,"Qu'est ce que PHP ?",28,1,1,"NA"

78 Gestion de chiers 78 Exploiter un chier de tableur (CSV) La fonction fgetcsv() permet de lire une ligne dun chier CSV précédemment ouvert avec fopen(). Elle renvoie un tableau indexé avec les différentes valeurs et fonctionne de manière similaire à fgets(). Le premier argument est le descripteur de chier et le second est la taille maximale de la ligne. Il faut bien faire attention à ce que la taille précisée soit supérieure au nombre de caractères de la ligne la plus longue du chier.

79 Gestion de chiers 79 Exploiter un chier de tableur (CSV) Deux paramètres optionnels sont disponibles : le premier vous permet de préciser un séparateur de deuxième dimension alternatif (la virgule est utilisée par défaut) et le second un délimiteur pour les chaînes de texte (sinon, le guillemet est utilisé).

80 Gestion de chiers 80 Écriture rapide Par rapport à la lecture, il y a moins de besoins différents pour écrire dans un chier. Il en résulte quil nexiste quune seule fonction daccès rapide pour écrire dans un chier. La fonction file_put_contents() prend en paramètre une adresse de chier et une chaîne de caractères. La chaîne est alors écrite dans le chier. Si le chier existait déjà, son contenu est écrasé.

81 Gestion de chiers 81 Écriture rapide Il est toutefois possible de demander à ce que la chaîne en argument soit ajoutée au chier au lieu de remplacer le contenu actuel. Il suft alors de spécier la constante FILE_APPEND comme troisième paramètre optionnel.

82 Gestion de chiers 82 Ouverture dun chier Avant dutiliser un chier, il faut louvrir. Derrière ce terme se cache une dénition simple: on demande au système dexploitation de rechercher un chier à partir de son adresse et de nous retourner un pointeur vers ce chier. Ce pointeur est appelé descripteur de chier (le descriptor). La fonction fopen() permet de déclencher louverture. Elle prend deux paramètres : le nom complet (avec ladresse) du chier, et un mode douverture.

83 Gestion de chiers 83 Ouverture dun chier : Mode douverture Sous Windows, il est demandé de faire la distinction entre un chier binaire et un chier texte, le système dexploitation traitant de manière spécique les ns de ligne lors de laccès aux chiers texte. Dans le cas dun chier binaire, il faut ajouter la lettre b (binary) juste après le r. Dans le cas dun chier texte, il faut ajouter t (text). Utiliser ces sufxes na aucune inuence sur les autres systèmes dexploitation. Il est donc recommandé de toujours utiliser le sufxe b quand on ouvre un chier sous Unix.

84 Gestion de chiers 84 Lecture dun chier La fonction fgetc() prend en paramètre le descripteur de chier, lit un caractère et le renvoie comme valeur de retour. Lors du prochain appel, la fonction lira le caractère suivant, et ainsi de suite jusquà la n du chier. Sil ny a plus de caractère à lire, alors la fonction renvoie la valeur FALSE.

85 Gestion de chiers 85 Lecture dun chier La fonction fgets() retourne tous les caractères jusquà la prochaine n de ligne. Elle permet donc de récupérer un chier ligne par ligne. Si vous spéciez une taille en octets comme deuxième paramètre, fgets() retournera au maximum ce nombre de caractères, même si aucune n de ligne na été trouvée. Il est fréquent de spécier une taille arbitraire de octets pour lire toute la ligne. Si la chaîne retournée ne se termine pas par une n de ligne et contient moins de caractères que le maximum autorisé, cest quon est arrivé en n de chier.

86 Gestion de chiers 86 Lecture dun chier La fonction fread() permet de lire plusieurs octets en une fois et retourne une chaîne de caractères. Le nombre doctets à lire est à spécier en second paramètre, après le descripteur de chier. Si la chaîne retournée est plus courte que ce qui a été demandé, cest que la n du chier a été atteinte.

87 Gestion de chiers 87 Écriture dans un chier Il existe une seule fonction décriture simple : fwrite(). Elle prend en paramètre le descripteur de chier et la chaîne à insérer dans le chier.

88 Gestion de chiers 88 Positions dans le chier Comme on la vu précédemment, le système garde en mémoire un pointeur de position dans le chier. Il permet de lire ou décrire le chier séquentiellement. Ce pointeur est automatiquement géré lors des lectures et écritures de façon à avancer à chaque opération. Il est possible de dénir manuellement une position. Cest utile par exemple pour revenir au début du chier ou retenir une position pour y revenir par la suite. Trois fonctions permettent de traiter les opérations courantes sur ce pointeur de position.

89 Gestion de chiers 89 Positions dans le chier La fonction rewind() permet de revenir en début de chier, à loctet zéro. Elle prend en paramètre un descripteur de chier retourné par fopen(), renvoie TRUE en cas de réussite et FALSE en cas déchec.

90 Gestion de chiers 90 Positions dans le chier La fonction fseek() permet de positionner le pointeur de position à un certain endroit dans le chier. Elle prend en paramètre le descripteur de chier et un nombre doctets.

91 Gestion de chiers 91 Positions dans le chier La fonction fseek() est habituellement utilisée de concert avec ftell(), qui permet de connaître la position actuelle du pointeur à partir du descripteur de chier. Cest par exemple utile pour retenir une position et y revenir par la suite ou construire un index du chier qui évitera de le parcourir complètement la prochaine fois.

92 Gestion de chiers 92 Détection de n de chier Vous pouvez tester si le pointeur de position est à la n du chier avec la fonction feof(). Elle prend en argument le descripteur de chier et renvoie TRUE si le pointeur est à la n du chier, FALSE sinon.

93 Gestion de chiers 93 Fermeture dun chier Une fois que le chier a été manipulé, il faut le fermer. Cette action permet au système de libérer les ressources associées au chier. Comme pour les bases de données, PHP ferme automatiquement à la n du script les chiers encore ouverts. Le nombre de chiers ouverts sur un système est toutefois limité. An de ne pas surcharger le système, il est important de toujours fermer les chiers ouverts une fois quon a ni de les utiliser. Pour ce faire, il suft dutiliser la fonction fclose() en lui donnant le descripteur de chier en argument.

94 Gestion de chiers 94 Gestion du tampon Lors des écritures dans les chiers, les données écrites sont inscrites en mémoire plutôt que directement dans le chier. Elles ne sont recopiées sur le disque que par paquets ou à la fermeture, an de minimiser les appels système et les accès disque. Il est pourtant possible de demander à PHP de forcer lécriture de toutes les données se trouvant actuellement dans le tampon mémoire grâce à la fonction fflush(). Elle prend en unique argument le descripteur de chier.

95 Gestion de chiers 95 Accès concurrents Pour éviter des accès concurrents, il est possible de verrouiller un chier quand on lutilise. Un verrou peut être soit partagé (pour faire des lectures, autorisant plusieurs accès partagés simultanément), soit exclusif (pour écrire, aucun autre accès nest alors autorisé en même temps). Pour poser ce type de verrous, on utilise la fonction flock(). Elle prend en paramètres le descripteur de chier et soit LOCK_SH (pour un verrou partagé), soit LOCK_EX (pour un verrou exclusif). Pour relâcher le verrou, il faut refaire un appel à flock() avec la valeur LOCK_UN.

96 Gestion de chiers 96 Manipulation de chiers : Copie et déplacement Pour copier ou déplacer un chier, vous pouvez utiliser les fonctions copy() (copier) et rename() (déplacer). Pour les deux fonctions, le premier argument est ladresse source et le second argument est ladresse destination.

97 Gestion de chiers 97 Manipulation de chiers : Création et effacement Pour créer un chier, il existe deux méthodes. La première est douvrir le chier en écriture avec fopen() et de le fermer après (éventuellement en le remplissant entre- temps). La seconde option est de fournir ladresse à la fonction touch(). Elle créera le chier sil nexiste pas ou mettra à jour ses dates daccès et de modication sil existe.

98 Gestion de chiers 98 Manipulation de chiers : Création et effacement Il est également possible dutiliser cette fonction pour changer la date de modication dun chier. Pour cela, il faut spécier la date souhaitée sous forme dun timestamp dans le second argument.

99 Gestion de chiers 99 Manipulation de chiers : Création et effacement Dans les systèmes Unix, on différencie ladresse dun chier et son contenu. En spéciant une adresse, on dit quon lie le contenu à un répertoire sous un certain nom. Un même contenu peut avoir plusieurs adresses (plusieurs liens physiques) ; le contenu nest effacé que quand le dernier lien est supprimé et que plus aucun processus ny accède. La fonction deffacement de PHP hérite de ce nom, même si elle fonctionne aussi sous Windows. Vous pouvez effacer une adresse en la fournissant en argument à la fonction unlink(). if ( file_exists($fichier) ) { unlink( $fichier ) ; } if ( file_exists($fichier) ) { unlink( $fichier ) ; }

100 Gestion de chiers 100 Manipulation de chiers : Liens Il existe deux sortes de liens : les liens physiques (hard link) et les liens symboliques (symbolic link ou soft link). Les liens physiques servent à référencer un même chier à deux adresses différentes sur un disque. Vous pouvez créer un tel lien en appelant la fonction link() avec, comme premier argument, le chier source à utiliser et, comme second argument, ladresse à laquelle faire le lien. Par la suite, la source comme la destination seront considérées comme un même chier et auront des propriétés identiques. En revanche, leffacement dune adresse neffacera pas lautre ; elle supprimera simplement une des deux références. Le lien symbolique est une sorte de raccourci. Contrairement au lien physique, les deux adresses de chier ne sont pas identiques : lune correspond réellement au chier et lautre restera toujours un raccourci. Pour créer un lien symbolique, utilisez la fonction symlink() au lieu de link(). La plupart des fonctions de traitement de chier détectent les liens symboliques et font leur opération sur la cible, pas sur le lien lui-même.

101 Gestion de chiers 101 Manipulation de chiers : Fichiers temporaires PHP met à disposition la fonction tmpfile(). Utilisée sans argument, elle retourne un descripteur de chier comme si vous aviez utilisé fopen(). Le chier est placé dans le répertoire temporaire du système et est automatiquement effacé à la fermeture du script. Si vous souhaitez pouvoir manipuler le chier sans quil ne soit effacé, vous pouvez utiliser la fonction tempnam() en fournissant en arguments une adresse de répertoire et un préxe de nom de chier. Un chier au nom aléatoire préxé par le deuxième argument sera créé dans le répertoire spécié et son adresse complète vous sera renvoyée (ou FALSE en cas derreur). Si le répertoire nexiste pas, le répertoire temporaire du système sera utilisé. Contrairement à tmpfile(), le chier temporaire nest pas effacé à la n du script. Il vous appartient de le faire manuellement.

102 Gestion de chiers 102 Manipulation de chiers : Fichiers temporaires

103 Gestion de chiers 103 Gestion des répertoires Une des manipulations les plus fréquemment faites sur les systèmes de chiers est le parcours dun répertoire pour en lister les chiers. Il existe deux méthodes pour faire ce parcours avec PHP 5. La première est une méthode objet et la seconde repose sur une série de fonctions. Pour initialiser la lecture du répertoire, vous devez faire appel à la fonction dir() avec une adresse de répertoire comme argument. Un objet répertoire vous est renvoyé. read() ) { echo $nom, ' '; } $dir->close() ; ?> read() ) { echo $nom, ' '; } $dir->close() ; ?>

104 Gestion de chiers 104 Gestion des répertoires Vous pouvez utiliser les fonctions opendir(), readdir(), rewinddir() et closedir(), à la place de la méthode objet. Leur fonctionnement est identique aux méthodes décrites avant, si ce nest que lidentiant retourné par la première fonction devra être fourni en paramètre aux trois autres.

105 Gestion de chiers 105 Gestion des répertoires : Position dans larborescence Chaque processus a, pour le système dexploitation, une information nommée répertoire courant (ou répertoire de travail). Cest ce répertoire qui est utilisé comme référence dans les adresses relatives, que ce soit pour les ouvertures de chier ou les inclusions (par exemple include 'test.php'; ). Vous pouvez connaître le répertoire courant avec la fonction getcwd().

106 Gestion de chiers 106 Gestion des répertoires : Position dans larborescence Vous pouvez modier ce répertoire courant en fournissant une nouvelle adresse à la fonction chdir(). La nouvelle adresse servira de référence pour les futurs appels au système de chiers. Cette fonction retourne TRUE en cas de réussite et FALSE en cas derreur.

107 Gestion de chiers 107 Gestion des répertoires : Créations et effacements des dossiers Il existe des fonctions spéciques pour créer et supprimer les répertoires : mkdir() permet la création et rmdir() leffacement. Elles prennent toutes les deux comme premier paramètre ladresse du répertoire à créer (ou effacer). La fonction mkdir() prend optionnellement un paramètre supplémentaire dénissant les droits daccès (sous forme numérique) du répertoire à créer, la valeur 0777 étant la valeur par défaut. Cette valeur passe ensuite par le masque par défaut ; pensez donc à mettre un masque nul si vous souhaitez effectivement pouvoir donner tous les droits à tout le monde sur le répertoire.

108 Gestion de chiers 108 Informations sur les chiers Toutes les statistiques sur un chier sont récupérables à laide dappels système, mais comme ces appels se révèlent coûteux en performance, PHP place les résultats dans un cache. Il en résulte que si vous testez la date de modication avant et après avoir modié un chier, elle pourrait sembler navoir pas changé. Cest en fait que PHP se ressert de la valeur quil a récupérée précédemment. Pour vider le cache des informations sur létat des chiers, il vous suft dappeler la fonction clearstatcache(), sans argument.

109 Gestion de chiers 109 Informations sur les chiers : Existence dun chier La fonction file_exists() prend en paramètre une adresse de chier et renvoie TRUE si le chier existe, FALSE sinon. Il faut toutefois prendre en compte que la notion de chier est prise au sens large : un répertoire ou un lien (même menant à une destination inexistante) seront considérés comme des chiers.

110 Gestion de chiers 110 Informations sur les chiers : Dates de chiers Il existe habituellement trois dates concernant un chier : la date de création, la date de modication (dernier accès en écriture) et la date de dernier accès (lecture, écriture ou exécution). Vous pouvez obtenir la date de création avec la fonction filectime(), la date de dernière modication avec filemtime() et la date de dernier accès avec fileatime(). Ces trois fonctions prennent en paramètre ladresse du chier et retournent une date sous forme de timestamp Unix. filectime('fichier.txt')) { echo 'le fichier a été modifié depuis sa création'; } else { echo 'le fichier na pas été modifié'; } ?> filectime('fichier.txt')) { echo 'le fichier a été modifié depuis sa création'; } else { echo 'le fichier na pas été modifié'; } ?>

111 Gestion de chiers 111 Informations sur les chiers : Taille de chier Vous pouvez connaître la taille dun chier en utilisant la fonction filesize() avec ladresse du chier en argument. La taille sera retournée en octets. Dautres informations peuvent être récupérées en une fois dans un tableau associatif grâce à la fonction stat(), qui prend en argument une adresse de chier.

112 Gestion de chiers 112 Informations sur les chiers La fonction fstat() est similaire à stat() mais prend en paramètre un descripteur de chier au lieu dune adresse.

113 Gestion de chiers 113 Espace disque disponible Il est possible de vérier lespace disponible sur un système de chiers en spéciant une adresse de chier ou de répertoire de cette partition à la fonction disk_free_space(). La fonction disk_total_space() fonctionne de la même façon, mais donne la taille totale de la partition. < ?php $repertoire = '/tmp' ; $place = disk_free_space($repertoire) ; echo "il reste $place octets de libre"; ?> < ?php $repertoire = '/tmp' ; $place = disk_free_space($repertoire) ; echo "il reste $place octets de libre"; ?>

114 Gestion de chiers 114 Nom et adresse dun chier La fonction realpath() permet de connaître le chemin réel dun chier sous sa forme canonique. Une adresse relative sera transformée en adresse absolue, les liens symboliques seront résolus et les références telles que./,../ ou les / surnuméraires seront transformés. Cette fonction est utile principalement dans deux cas : pour transformer une adresse relative en adresse absolue, et pour vérier ladresse réelle à partir dune adresse donnée par un visiteur. On évite ainsi de se faire leurrer par des liens symboliques ou des adresses masquées par des références relatives. Dans lexemple suivant, on peut voir une façon déviter ce genre de piège :

115 Gestion de chiers 115 Nom et adresse dun chier Une adresse de chier contient trois parties : ladresse du répertoire source, le nom de chier et lextension. À partir dune adresse de chier, la fonction dirname() permet de récupérer ladresse du répertoire source et la fonction basename() retournera lensemble nom de chier et extension. Les deux fonctions prennent en argument ladresse à traiter. Attention toutefois à dirname(), qui ne sait traiter correctement quune adresse absolue. La fonction pathinfo() permet de récupérer les trois parties dune adresse en une étape. En fournissant en argument ladresse à traiter, la fonction vous retournera un tableau associatif. Dans ce tableau, les répertoire, nom et extension sont référencés par les indices dirname, basename et extension. Les deux premiers indices donneront les mêmes résultats que les fonctions respectives dirname() et basename().

116 Gestion de chiers 116 Nature des chiers Il est possible de déterminer la nature dune adresse avec trois fonctions : is_dir(), is_link() et is_file() renvoient TRUE si ladresse fournie en argument est respectivement un répertoire, un lien ou un chier, et FALSE sinon. La fonction filetype() renvoie, elle, le type du chier à partir de son adresse. La chaîne renvoyée contient alors une des valeurs suivantes : fifo, char, dir, block, link, file ou unknown.

117 Gestion de chiers 117 Liens symboliques Quand vous manipulez ladresse dun lien symbolique, les fonctions lisent pour la plupart le contenu et les propriétés de la cible et non du lien lui-même. Vous pouvez toutefois récupérer ladresse de la cible en lisant le raccourci avec la fonction readlink(), qui prend ladresse du raccourci en argument. Il est aussi possible de vérier que la cible existe et est valide avec la fonction linkinfo(), qui renvoie une valeur nulle si la cible nexiste pas (ou est invalide). Si vous souhaitez récupérer explicitement les informations sur un lien symbolique et non sur sa cible, vous pouvez utiliser la fonction lstat() au lieu de stat().

118 Gestion de chiers 118 Permissions et droits daccès Les fonctions fileowner() et filegroup() permettent de récupérer le propriétaire (respectivement utilisateur et groupe) à partir dune adresse de chier. La valeur de retour est un identiant numérique. La fonction fileperms() retourne les permissions Unix associées au chier spécié. Dans une représentation octale, de droite à gauche, le premier chiffre correspond aux permissions pour tout le monde, le second aux permissions pour le groupe propriétaire et le troisième aux permissions pour lutilisateur propriétaire. An de faciliter les vérications, il est possible de savoir directement si un chier nous est accessible. La fonction is_readable() renvoie TRUE si le chier est accessible en lecture et FALSE sinon. La fonction is_writable() fait de même pour les droits décriture et la fonction is_executable() pour les droits dexécution.

119 Gestion de chiers 119 Permissions et droits daccès

120 Gestion de chiers 120 Permissions et droits daccès : Changement de propriétaire Il est possible de modier le groupe ou lutilisateur propriétaire dun chier grâce aux fonctions chown() et chgrp(). Ces fonctions prennent en paramètres ladresse du chier à modier et le nom (ou identiant numérique) de lutilisateur ou du groupe cible. Il nest normalement possible de modier lutilisateur propriétaire que si vous êtes super-utilisateur (root sous Unix). De même, vous ne pourrez modier le groupe que si vous êtes le propriétaire du chier et que le groupe cible soit un des groupes auxquels vous appartenez. // Change le propriétaire du répertoire /home/eda chown('/home/eda', 'eda') ; // Change le propriétaire du répertoire /home/eda chown('/home/eda', 'eda') ;

121 Gestion de chiers 121 Permissions et droits daccès : Modier les permissions Si vous êtes super-utilisateur ou propriétaire dun chier, vous pouvez en modier les permissions. Les nouvelles permissions sont à fournir sous forme numérique en second argument à la fonction chmod(), le premier argument étant ladresse du chier à modier.

122 Gestion de chiers 122 Permissions et droits daccès : Masque par défaut Si un chier est créé lors de son ouverture, il hérite automatiquement des droits daccès du script (généralement ceux du serveur web) : utilisateur et groupe propriétaires, droits daccès par défaut de cet utilisateur. Les droits daccès Unix par défaut sont gérés avec un principe de masque. Avec un masque nul, les chiers sont librement accessibles (permissions 0777). Avec un masque XYZ, les permissions seront de 0(7-X)(7-Y)(7-Z). Assez souvent, on met le masque à 0022 (pas de droits décriture pour un autre que le propriétaire) ou 0077 (aucun accès pour un autre que le propriétaire). Vous pouvez redénir le masque par défaut en le fournissant en argument à la fonction umask().

123 Gestion de chiers 123 Cas dapplication : Outil de gestion documentaire simple Pour vos documents internes, les utilisateurs avaient lhabitude de partager un même espace FTP où ils mettaient à jour directement les chiers. Naturellement, constatant le besoin darchives, ils ont commencé à ajouter un numéro de version et les initiales du dernier auteur dans le nom du document à chaque modication (laissant lancienne copie sur le serveur FTP). Une application interne relisant les documents a formalisé cette procédure. Les noms de chiers sont de la forme : nomDocument-numeroVersion-initialesDernierAuteur.extension An de faciliter les modications par les utilisateurs, il a été décidé de développer une application qui gère toute seule lincrémentation des numéros et la modication des initiales. Elle pourrait même prévenir si jamais deux personnes ont modié la même version.

124 Gestion de chiers 124 Cas dapplication : Outil de gestion documentaire simple On considère pour cet exemple que votre applicatif web fournit déjà une interface pour envoyer un chier par formulaire et une pour récupérer les initiales de la personne qui utilise la plate-forme. Pour cet exemple simple, le chier ne doit pas contenir de tiret dans son nom et doit être normé comme indiqué : nomDocument-numeroVersion-initialesDernierAuteur.extension Il suft donc à un utilisateur de récupérer la dernière version du chier, de le modier, de lenregistrer (sans changer son nom) et de lenvoyer par le formulaire. Le système se chargera de le mettre à jour.

125 Gestion de chiers 125 Cas dapplication : Outil de gestion documentaire simple envoyer un fichier

envoyer un fichier

126 Gestion de chiers 126 Cas dapplication : Outil de gestion documentaire simple

127 Gestion de chiers 127 Cas dapplication : Outil de gestion documentaire simple //Il nous faut ensuite aller regarder sur le répertoire quelle est la dernière version de ce document. $versionActuelle = 0 ; foreach( glob($document.'-*-*'.$extension) as $fichier ) { $debut = strpos($fichier, '-' ) + 1; $longueur = strrpos($fichier, '-') - $debut; $version = substr($fichier, $debut, $longueur) ; if ($version > $versionActuelle) { $versionActuelle = $version ; $fichierActuel = $fichier ; } //Il nous faut ensuite aller regarder sur le répertoire quelle est la dernière version de ce document. $versionActuelle = 0 ; foreach( glob($document.'-*-*'.$extension) as $fichier ) { $debut = strpos($fichier, '-' ) + 1; $longueur = strrpos($fichier, '-') - $debut; $version = substr($fichier, $debut, $longueur) ; if ($version > $versionActuelle) { $versionActuelle = $version ; $fichierActuel = $fichier ; }

128 Gestion de chiers 128 Cas dapplication : Outil de gestion documentaire simple //Il ne nous reste plus quà interpréter ces résultats et renvoyer le résultat à lutilisateur : session_start() ; if ($versionActuelle > $ancienneVersion) { echo "Le document a été modifié depuis votre dernier passage. " ; echo "Veuillez récupérer la dernière version ($fichier), " ; echo "la mettre à jour et la renvoyer." ; } else { $fichier = $document.'-'.($ancienneVersion + 1).'-'.$_SESSION['initialesAuteur']. $extension ; move_uploaded_file($_FILES['fichier']['tmp_name'], $fichier) ; echo "fichier correctement mis à jour vers $fichier" ; } ?> //Il ne nous reste plus quà interpréter ces résultats et renvoyer le résultat à lutilisateur : session_start() ; if ($versionActuelle > $ancienneVersion) { echo "Le document a été modifié depuis votre dernier passage. " ; echo "Veuillez récupérer la dernière version ($fichier), " ; echo "la mettre à jour et la renvoyer." ; } else { $fichier = $document.'-'.($ancienneVersion + 1).'-'.$_SESSION['initialesAuteur']. $extension ; move_uploaded_file($_FILES['fichier']['tmp_name'], $fichier) ; echo "fichier correctement mis à jour vers $fichier" ; } ?>


Télécharger ppt "1. Sommaire Quest-ce que PHP ? Les structures de base Traitements de base Traitements de chaînes Utilisation des tableaux Fonctions usuelles Formulaires."

Présentations similaires


Annonces Google