1.28k likes | 1.45k Views
Le langage PHP 5. Sommaire. Qu’est-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
E N D
Sommaire • Qu’est-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 fichiers • Gestion des flux et Flux de sortie PHP • Envoyer et recevoir des e-mails • Travailler avec une base de données
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
Gestion des objets Introduction aux objets • Chaque objet a des attributs qui lui sont propres. Mon compte en banque a un attribut qui définit le numéro de compte, un autre qui définit 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 l’objet. • Les objets peuvent avoir des méthodes. Il s’agit des actions qu’on 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.
Gestion des objets Introduction aux objets • Une classe est un modèle de données. On peut la voir comme une famille d’objets. Tous les objets d’une 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 d’immatriculation, un moteur avec une certaine puissance et un nombre de portières identifiables (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.
Gestion des objets Introduction aux objets • Une instance est une représentation particulière d’une classe. • Pour donner un exemple, Mégane est une classe et une instance de cette classe pourrait être la voiture que vous venez d’acheter, 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 qu’il peut y avoir plusieurs instances ayant les mêmes propriétés sans qu’elles soient identiques. Par exemple, si quelqu’un d’autre achète la même voiture que vous, une Mégane bleue sans options, il s’agira d’une autre instance de la même classe.
Gestion des objets Utilisation des objets • Le mot-clé class permet de définir une nouvelle classe. Il doit être suivi du nom de la classe et d’un bloc entre accolades. Entre ces accolades pourront être insérés les attributs de la classe et les définitions des méthodes, ou encore des commentaires. <?php class voiture { public $marque ; function freiner( $force_de_freinage ) { // Instructions pour faire freiner } } ?>
Gestion des objets Utilisation des objets : Constantes • La version 5 de PHP permet de définir des constantes locales à une classe. De telles constantes vous permettent de ne pas polluer l’espace global avec des constantes que vous n’utilisez que dans le cadre d’un certain type d’objet. Une convention classique est de spécifier les constantes en majuscules dans le code pour mieux les identifier et les isoler. <?php class TondeuseGazon { const TRACTEE = 1 ; const AUTOPORTEE = 2 ; const POUSSEE = 4 ; public $type ; } ?>
Gestion des objets Utilisation des objets : Instanciation • Pour pouvoir utiliser un objet, il faut d’abord le créer à partir d’un modèle (la classe). <?php // Déclaration de la classe class voiture { public $marque ; function freiner( $force_de_freinage ) { // Instructions pour faire freiner } } // Instanciation d’un objet $mavoiture = new voiture() ; ?>
Gestion des objets Utilisation des objets : Utilisation d’un attribut • Une fois qu’un objet a été instancié, on peut commencer à utiliser ses attributs et ses méthodes. Les attributs s’utilisent comme des variables classiques. <?php class CompteEnBanque { public $solde = 0; } $mon_compte = new CompteEnBanque() ; 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 ?>
Gestion des objets Utilisation des objets : Utilisation des méthodes • L’appel d’une méthode se fait de façon similaire à celui d’une fonction. <?php class voiture { function klaxonne() { echo "Vous klaxonnez fort !" ; } } $ma_voiture = new voiture() ; $ma_voiture->klaxonne () ; // Affiche Vous klaxonnez fort ! ?>
Gestion des objets Utilisation des objets : Référence à l’objet en cours • Il est souvent utile de pouvoir faire référence à l’objet en cours dans une méthode. C’est 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 l’objet courant. <?php class voiture { public $vitesse = 0; function avance( $temps ) { $distance = $temps * $this->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<br>'; $ma_voiture->avance( 2 ) ; // On avance 2h ?>
Gestion des objets Utilisation des objets : Constantes d’aide 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 d’exécution. <?php class voiture { public $vitesse ; function avance( $temps ) { echo 'classe : ', __CLASS__, ' - ' , __METHOD__, '<br>' ; } } $ma_voiture = new voiture() ; $ma_voiture->vitesse = 100 ; // On avance à 100 km/h $ma_voiture->avance( 2 ); ?>
Gestion des objets Utilisation des objets : Accès à une constante depuis l’extérieur • Depuis n’importe où dans le code, vous pouvez faire référence à une constante de la classe xxx grâce à l’opérateur xxx::. <?php class TondeuseGazon { const TRACTEE = 1 ; const AUTOPORTEE = 2 ; const POUSSEE = 4 ; public $type ; } $maTondeuse = new TondeuseGazon() ; $maTondeuse->type = TondeuseGazon::POUSSEE ; echo $maTondeuse->type ; // Affiche le chiffre 4 ?>
Gestion des objets Utilisation des objets : Accès à une constante locale • À l’intérieur d’une méthode, il est aussi possible d’accéder aux constantes de l’objet en cours grâce à l’opérateur self::. <?php class TondeuseGazon { const TRACTEE = 1 ; const AUTOPORTEE = 2 ; const POUSSEE = 4 ; public $type ; functionsetTondeusePoussee() { $this->type = self::POUSSEE ; } } $maTondeuse = new TondeuseGazon() ; $maTondeuse->setTondeusePoussee() ; echo $maTondeuse->type ; // Affiche le chiffre 4 ?>
Gestion des objets Utilisation des objets : Affichage d’un objet • Quand vous essayez d’afficher 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éfinie, le résultat de son appel est affiché à la place du texte « Object ». <?php class voiture { function__tostring() { return 'Vous êtes dans la classe \'voiture\'' ; } } $maVoiture = new voiture() ; echo $maVoiture ; ?>
Gestion des objets Utilisation des objets : Vérifier le type d’un objet • Dans vos applications, vous aurez probablement besoin de savoir de quel type est un objet, ou s’il appartient à un sous-type d’une classe connue. Vous pouvez vérifier qu’un objet spécifié appartient à une classe donnée ou à une de ses sous-classes grâce au mot-clé instanceof. class voiture { } $maVoiture = new voiture() ; if ($maVoitureinstanceof voiture) { echo "Il s’agit d’une voiture" ; } else { echo "Il ne s’agit pas d’une voiture" ; } ?>
Gestion des objets Utilisation des objets : Vérifier le type d’un objet • Il est possible de connaître la classe exacte d’un 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 l’objet. <?php class voiture { } $maVoiture = new voiture() ; echoget_class($maVoiture) ; // Affiche voiture ?>
Gestion des objets Utilisation des objets : Vérifier le type d’un objet • Il est aussi possible de remonter la hiérarchie des classes et d’accé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. <?php class vehicule { } class voiture extendsvehicule { } $maVoiture = new voiture() ; echoget_class($maVoiture) ; // Affiche voiture echoget_parent_class($maVoiture) ; // Affiche vehicule echoget_parent_class('voiture') ; // Affiche vehicule ?>
Gestion des objets Copie et référence • La version 5 de PHP utilise par défaut l’affectation par référence quand il s’agit d’objets. Pour simplifier, on peut considérer que l’opérateur & est toujours présent, implicitement, à chaque fois qu’un objet est affecté à une variable ou passé à une fonction. <?php // PHP 5 class compte { public $montant ; function virer($valeur, $destination) { $this->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 ?>
Gestion des objets 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 l’ancien comportement en activant dans php.ini la directive de configurationzend.ze1_compatibility_mode. • Vous ne pourrez toutefois pas mixer les comportements PHP 4 et PHP 5 dans une même exécution.
Gestion des objets La copie explicite d’objet, 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 : <?php class objet { public $nombre ; function affiche() { echo "objet ".$this->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 l’objet 2 n’a pas affecté l’objet 1 ?>
Gestion des objets La copie explicite d’objet, ou clonage • Vous pouvez redéfinir le comportement du mot-clé clone en définissant une méthode __clone() dans votre classe. Cela peut par exemple être utile pour gérer des ressources comme des descripteurs de fichiers, des connexions vers des bases de données, des identifiants uniques, etc. <?php class test { public $compte = 1 ; function__clone() { $this->compte = 10 ; } } $original = new test() ; $copie = clone $original ; echo $copie->compte ; // Affiche 10 ?>
Gestion des objets Égalité et identité • L’utilisation des copies et des références peut amener à des erreurs simples lors des tests d’égalité. Il faut bien faire attention à ce que l’on veut : soit tester l’égalité (tous les attributs sont égaux) ; soit tester l’identité (les deux variables référencent le même objet). L’égalité est testée par == ; l’identité est testée par === <?php class test { var $var = 1 ; } $a = new test() ; $b = $a ; $c =& $b ; if ($a == $b) echo '$a est égal à $b <br>' ; if ($b == $c) echo '$b est égal à $c <br>' ; if ($a === $b) echo '$a est une référence de $b <br>' ; if ($b === $c) echo '$b est une référence de $c <br>' ; ?>
Gestion des objets Constructeurs et destructeurs • PHP prévoit un moyen d’initialiser un objet à sa création. Il s’agit d’exécuter une méthode spécifique [__construct()] lors de la création de l’objet. On parle de constructeur. <?php class voiture { public $vitesse = 0; public $marque; public $annee; public $modele; // Définition du constructeur function__construct($marque,$modele,$annee) { $this->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, '<br>'; • echo 'Le modèle est ', $this->modele, '<br>'; • echo 'L\'année d\'achat est ', $this->annee, '<br>'; • } • } • $ma_voiture = new voiture('Renault','clio',2004) ; • $ma_voiture->affiche(); • ?>
Gestion des objets Constructeurs et destructeurs • De la même manière qu’il existe un constructeur, on peut définir un destructeur. Il s’agit d’une méthode nommée __destruct(). Elle est automatiquement appelée quand l’objet est détruit, soit par delete() ou unset(), soit à la fin du script. <?php class mere { function__destruct() { echo "appel au destructeur de la classe mère <br>" ; } } class fille extendsmere{ function__destruct() { echo "appel au destructeur de la classe fille <br>" ; parent::__destruct() ; } } $objet = new fille() ; unset($fille) ; // Affiche // appel au destructeur de la classe fille // appel au destructeur de la classe mère ?>
Gestion des objets La notion d’héritage • Assez souvent, plusieurs classes partagent elles-mêmes certains de leurs attributs et méthodes. On peut parler de catégories d’objets et de sous-catégories. • Il est possible d’expliquer cette relation avec la notion d’héritage. Ainsi, l’objet qui définit 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 d’une seule classe. L’héritage multiple est interdit
Gestion des objets La notion d’héritage • Dans l’exemple, la classe des voitures hérite de la classe des véhicules à moteur. <?php class vehicule_a_moteur{ public function freine(){ // Code pour vehicule_a_moteur.freine ... } public function avance(){ // Code pour vehicule_a_moteur.avance ... } } class voiture extendsvehicule_a_moteur{ public $marque; public $modele; public $annee; public function klaxonne(){ // Code pour voiture.klaxonne ... } public function avance($temps=NULL){ // Code pour voiture.avance ... } public function freine($temps=NULL){ // Code pour voiture.freine ... } public functiondemarre(){ // Code pour voiture.demarre ... } } ?>
Gestion des objets Redéfinition d’attribut ou de méthode • Si un attribut est redéfini, c’est sa dernière définition qui est utilisée pour déterminer la valeur par défaut de l’objet de la classe fille : <?php class vehicule_a_moteur { public $nombre_roues = 2 ; } class voiture extendsvehicule_a_moteur { public $nombre_roues = 4 ; } $berline = new voiture() ; echo $berline->nombre_roues ; // Affiche 4 ?> <?php class vehicule_a_moteur { functionnombre_de_roues() { echo 2 ; } } class voiture extendsvehicule_a_moteur { functionnombre_de_roues() { echo 4 ; } } $berline = new voiture() ; $berline->nombre_de_roues() ; // Affiche 4 ?>
Gestion des objets Accès aux méthodes parentes • Si une méthode est redéfinie dans la classe fille, il peut être utile de volontairement appeler la méthode de la classe parente. Il suffit alors d’utiliser une notation statique avec le mot-clé parent. La syntaxe parent::xxx() permet d’accéder à la méthode xxx de la classe mère. <?php class vehicule_a_moteur { function avancer() { echo "J'avance \n" ; } } class voiture extendsvehicule_a_moteur { functionpasser_la_vitesse( $vitesse ) { echo "Je passe la vitesse $vitesse \n" ; } function avancer() { $this->passer_la_vitesse(1) ; parent::avancer() ; } } $maVoiture = new voiture() ; $maVoiture->avancer() ; // Affiche "Je passe la vitesse 1" puis "J’avance" ?>
Gestion des objets Sûreté de programmation : Contrôle d’accès • Le contrôle d’accès est une fonctionnalité qui permet de filtrer 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é n’est utilisable qu’à l’intérieur même de la classe. Il est interdit d’y faire appel à partir de l’exté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 l’extérieur de l’objet, mais la méthode (ou l’attribut) est utilisable par les classes dérivées. Le mot-clé pour un accès protégé est protected.
Gestion des objets Sûreté de programmation : Contrôle d’accès class vehicule_a_moteur { protected $vitesse = 30 ; private $roues = 4 ; } class voiture extendsvehicule_a_moteur { public function avancer() { echo "J'avance à la vitesse de " ; echo $this->vitesse , " km/h \n" ; // Appel autorisé car on est à l’intérieur d’une classe dérivée } public functionnombreRoues() { echo "il y a ", $this->roues, "\n" ; // Appel interdit, le nombre de roues est privé } } $maVoiture = new voiture() ; $maVoiture->avancer() ; // Affiche "J’avance à la vitesse de 30km/h" $maVoiture->nombreRoues() ; // Génère une erreur fatale car la méthode essaie d’accéder à un attribut privé
Gestion des objets Sûreté de programmation : Contrôle d’accès • L’utilisation ou non des contrôles d’accès est un choix que vous devez faire au début de votre projet. Globalement, ces syntaxes permettent de repérer facilement les erreurs d’accès à certains composants. • Ces fonctionnalités sont particulièrement utiles lors d’un développement à plusieurs ou lors de la programmation d’une brique logicielle. Marquer explicitement des méthodes ou des attributs comme privés ou protégés permet de dissuader l’utilisateur de ces objets d’accéder à des détails d’implémentation qui peuvent changer par la suite.
Gestion des objets 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 n’accepter qu’un type d’objet bien précis comme paramètre. Il suffit alors de préfixer le paramètre par le nom de la classe souhaitée. <?php class voiture { public $marque = 'Fiat' ; functionfaireUnAccidentAvec( voiture $autreVoiture ) { echo 'Il y a eu un accident avec une voiture ' ; echo $autreVoiture->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' // n’est pas un objet de type voiture, ni un sous-type de voiture ?>
Gestion des objets Sûreté de programmation : Classes abstraites • Une classe abstraite est un début d’implémentation d’une classe. On définit certaines méthodes et attributs en obligeant les classes dérivées à les implémenter. On peut ainsi présenter un début d’implé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 n’est pas le cas, PHP renvoie une erreur. abstract class vehicule { abstract function avancer(); abstract functionarreter(); } $test = new vehicule() ; // Provoque une erreur fatale, on essaye d’instancier une classe abstraite directement class voiture extendsvehicule { function avancer() { echo 'on avance' ; } } // Provoque une erreur fatale car la classe voiture n’implémente rien pour s’arrêter et n’est pas notée abstraite
Gestion des objets Sûreté de programmation : Interfaces • La notion d’interface est proche de celle de classe abstraite, mais un peu plus générique. Il s’agit de définir une API (Application Programming Interface) qui sera utilisée par un composant. Tous les objets qui passeront par ce composant devront, pour que l’application 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 d’implémenter plusieurs interfaces en les séparant par des virgules.
Gestion des objets Sûreté de programmation : Interfaces interface faitDeLaLumiere { function allumer() ; functioneteindre() ; } class voiture implementspeutAvancer, faitDeLaLumiere { function avancer() { echo 'on avance' ; } functionarreter() { echo 'on arrete' ; } function allumer() { echo 'les phares sont allumés' ; } functioneteindre() { echo 'les phares sont éteints' ; } }
Gestion des objets 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écifiée comme abstraite pour ne pas provoquer une erreur fatale. Ni cette classe abstraite ni l’interface 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 qu’un objet se conforme à un certain comportement, ou qu’il peut gérer un certain type d’événements et de fonctionnalités.
Gestion des objets Sûreté de programmation : Classes et méthodes finales • Le concept de méthodes finales est l’opposé de celui de méthodes abstraites. Il s’agit de déclarer à PHP qu’aucune classe dérivée n’a le droit de modifier l’implé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éfinir une classe comme finale. Elle ne pourra alors plus être dérivée, toute l’implémentation est considérée comme bloquée. class voiture extendsvehicule { final function avancer() { echo 'on avance' ; } } final class voiture extendsvehicule { function avancer() { echo 'on avance' ; } }
Gestion des objets 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 d’objet. class voiture { public $roues = 4 ; function classique() { return $this->roues ; } function statique() { return 4 ; } } // Accès statique echovoiture::statique() ; // Affiche 4 echovoiture::classique() ; // N’affiche rien, génère une erreur // Accès classique $mavoiture = new voiture() ; echo $mavoiture->classique() ; // Affiche 4
Gestion des objets Accès statiques : Définition en vue d’un 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 suffit de préfixer la déclaration par le mot-clé static. <?php class voiture { static $roues = 4 ; static function statique() { return 4 ; } } echovoiture::statique() ; // Affiche 4 echo voiture::$roues ; // Affiche 4 ?>
Gestion des objets Accès statiques : Accès à la classe en cours • Lors d’un appel statique, on perd tout contexte. Il n’est plus possible d’utiliser 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 l’objet en cours). <?php class voiture { static $roues = 4 ; static function nombreRoues() { return self::$roues ; } } echo voiture::nombreRoues() ; // Affiche 4 ?>
Gestion des objets Accès statiques : Accès à la classe parente • Utiliser l’opérateur parent:: permet d’accéder aux méthodes parentes. Si vous êtes dans le contexte d’un objet, l’appel 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
Gestion des objets Chargement automatique • Pour faciliter l’utilisation des objets, PHP 5 propose un système de chargement automatique. Si vous tentez d’instancier un objet d’une 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 fichier PHP contenant sa définition. function__autoload( $nom_de_classe ) { require_once( 'lib/'.$nom_de_classe.'.class.php' ) ; } $objet = new MaClasse() ;
Gestion des objets Surcharge : Affectations des attributs • PHP définit trois méthodes dites de surcharge. Il s’agit d’intercepter les appels à des attributs ou à des méthodes non définis. Ces trois méthodes vous permettent de répondre à PHP comme si la méthode ou l’attribut existait. • Si votre classe implémente une méthode __set(), cette méthode sera appelée à chaque fois qu’on essaye d’affecter une valeur à un attribut inexistant. Cette méthode doit accepter deux paramètres, le nom de l’attribut et sa valeur. <?php class maClasse { private $valeurs = array() ; public function__set($nom, $valeur) { echo "on essaie de mettre '$valeur' dans $nom" ; $this->valeurs[$nom] = $valeur ; } } $monObjet = new maClasse() ; $monObjet->propriete = 'texte' ; // Affiche on essaie de mettre 'texte' dans propriete ?>
Gestion des objets Surcharge : Lecture d’attribut (Mutator) • Parallèlement à __set(), il existe un __get(). Si vous l’implémentez, cette méthode sera appelée à chaque fois qu’on essayera de lire un attribut inexistant dans un objet de la classe. Elle prend un paramètre qui définit le nom de l’attribut auquel on essaye d’accéder. La valeur de retour de __get() sera utilisée par PHP comme valeur de l’attribut, comme s’il existait. <?php class maClasse { private $valeurs = array() ; public function__set($nom, $valeur) { echo "on essaie de mettre '$valeur' dans $nom \n" ; $this->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 ?>
Gestion des objets Surcharge : Appel d’une 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. <?php class maClasse { public function__call($nom, $valeur) { echo "on essaye d'appeler $nom avec '$valeur[0]' \n" ; return strlen($valeur[0]) ; } } $monObjet = new maClasse() ; echo 'longueur : ', $monObjet->longueur('texte') ; // Affiche // On essaie d’appeler longueur avec 'texte' // longueur : 5 ?>
Gestion des objets Itérateurs : Utilisation simple • Utiliser un objet avec foreach() est en fait très simple. Il vous suffit pour cela d’implémenter l’interface Iterator. Dès lors, PHP pourra traverser votre objet avec foreach() comme s’il s’agissait d’un tableau. Votre objet pourra alors retourner une liste de couples clé/valeur lisible par PHP. • L’interface Iterator vous impose d’implé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 qu’il 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.
Gestion des objets Itérateurs : Utilisation simple <?php class ListeUtilisateurimplementsIterator { private $login = array(); private $uid = array() ; private $index = 0; public functioncurrent() { return $this->login[$this->index]; } public functionnext() { $this->index += 1 ; } public functionvalid() { return ($this->index +1 <= count($this->login)) ; } public functionkey() { return $this->uid[$this->index]; } public functionrewind() { $this->index = 0 ; } public functionajouteUtilisateur($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 <br />" ; }
Gestion des objets Itérateurs : Utilisation complète • Avoir toute l’interface d’itération dans l’objet n’est pas forcément pratique. PHP donne la possibilité à votre classe de retourner un objet qui servira d’interface pour foreach(). • Si votre classe implémente l’interface IteratorAggregate, elle devra implémenter une méthode getIterator(). Cette méthode doit retourner un objet implémentant l’interface Iterator et qui sera utilisé au final par foreach().