IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Introduction au langage PHP 5 par l'exemple


précédentsommairesuivant

VI. Les objets

VI-A. Toute variable peut devenir un objet doté d'attributs (exemple_14)

 
CacherSélectionnez

Résultats :

 
CacherSélectionnez

Commentaires

  • ligne 4 : la notation $obj->attr désigne l'attribut attr de la variable $obj. S'il n'existe pas il est créé, faisant ainsi de la variable $obj, un objet avec attributs.
  • ligne 13 : l'expression $obj2=$obj1, lorsque $obj1 est un objet, est une copie d'objets par référence. Ainsi $obj2 et $obj1 sont des références sur un même objet. L'objet lui-même peut être modifié par l'une ou l'autre des références.
  • ligne 20 : l'expression $obj3=&$obj1 affecte à $obj3 la référence (l'adresse) de la variable $obj1. Si $obj1 est un objet comme c'est le cas ici, l'expression précédente est équivalente à $obj3=$obj1.
  • lignes 28-29 : montrent qu'un objet peut être parcouru comme un dictionnaire. Les clés du dictionnaire sont les noms des attributs et les valeurs du dictionnaire, les valeurs de ces mêmes attributs.
  • ligne 27 : la fonction count peut être appliquée à un objet mais ne donne pas, comme on aurait pu s'y attendre, le nombre d'attributs. Donc un objet présente des similitudes avec un dictionnaire mais n'en est pas un.

VI-B. Une classe Personne sans attributs déclarés (exemple_15)

 
CacherSélectionnez

Résultats :

personne=[Paul,Langevin,48]

Commentaires

  • lignes 3-13 : définissent une classe Personne. Une classe est un moule à partir duquel on crée des objets. Une classe est un ensemble regroupant des attributs et des fonctions appelées méthodes. Il n'y a pas obligation à déclarer les attributs.
  • lignes 9-12 : la méthode identité affiche la valeur de trois attributs non déclarés dans la classe. Le mot clé $this désigne l'objet auquel on applique la méthode.
  • ligne 17 : on crée un objet $p de type Personne. Le mot clé new sert à créer un nouvel objet. L'opération rend une référence sur l'objet créé (donc une adresse). Diverses écritures sont possibles : new Personne(), new Personne, new personne. Le nom de la classe est insensible à la casse.
  • lignes 18-20 : les trois attributs nécessaires à la méthode identité sont créés dans l'objet $p.
  • ligne 22 : la méthode identité de la classe Personne est appliquée sur l'objet $p. Dans le code (lignes 9-11) de la méthode identité, $this référence le même objet que $p.

VI-C. La classe Personne avec attributs déclarés (exemple_16)

 
CacherSélectionnez

Résultats :

 
CacherSélectionnez

Commentaires

  • lignes 6-8 : les attributs de la classe sont explicitement déclarés avec le mot clé var.

VI-D. La classe Personne avec un constructeur (exemple_17)

Les exemples précédents montraient des classes Personne exotiques telles qu'on pouvait les trouver dans PHP 4. Il n'est pas conseillé de suivre ces exemples. Nous présentons maintenant une classe Personne correspondant aux bonnes pratiques de PHP 5 :

 
CacherSélectionnez

Résultats :

 
CacherSélectionnez

Commentaires

  • lignes 3-48 : la classe Personne
  • lignes 6-8 : les attributs privés (private) de la classe. Ces attributs ne sont visibles qu'à l'intérieur de la classe. Les autres mots clés utilisables sont :
  • public : fait de l'attribut un attribut public visible de l'extérieur de la classe
  • protected : fait de l'attribut un attribut protégé visible de l'intérieur de la classe et des classes dérivées de celle-ci.
  • parce que les attributs sont privés, on ne peut y accéder de l'extérieur de la classe. On ne peut donc écrire le code suivant :
 
CacherSélectionnez

Ici, on est en-dehors de la classe Personne. Comme l'attribut nom est privé, la ligne 2 est incorrecte. Pour initialiser les champs privés de l'objet $p, il y a deux moyens :

  • utiliser les méthodes publiques set et get (le nom de ces méthodes peut être quelconque) des lignes 11-33. On pourra alors écrire :
 
CacherSélectionnez
  • utiliser le constructeur des lignes 36-41. On écrira alors :
 
CacherSélectionnez

L'écriture ci-dessus, appelle automatiquement la méthode de la classe Personne appelée __construct.

  • ligne 54 : cette ligne affiche la personne $p sous la forme d'une chaîne de caractères. Pour ce faire, la méthode de la classe Personne appelée __toString est utilisée.

VI-E. La classe Personne avec contrôle de validité dans le constructeur (exemple_18)

Le constructeur d'une classe est le bon endroit pour vérifier que les valeurs d'initialisation de l'objet sont corrects. Mais un objet peut être également initialisé par ses méthodes set ou équivalentes. Pour éviter de mettre à deux endroits différents les mêmes vérifications, on mettra ces dernières dans les méthodes set. Si une valeur d'initialisation d'un objet se révèle incorrecte, on lancera une exception. Voici un exemple :

 
CacherSélectionnez

Résultats :

 
CacherSélectionnez

Commentaires

  • lignes 23-30 : initialisation de l'attribut prénom et vérification de la valeur d'initialisation
  • ligne 25 : utilisation d'une expression régulière. Le prénom est une suite d'un ou plusieurs caractères éventuellement suivi ou précédé d'espaces.
  • ligne 26 : si le nom est vide, on lance une exception sinon le prénom est mémorisé (ligne 28)
  • ligne 66 : utilisation du constructeur de la classe Personne
  • ligne 68 : utilisation de la méthode __toString de la classe Personne
  • lignes 70-74 : gestion de l'éventuelle exception lancée par le constructeur de la classe Personne.

VI-F. Ajout d'une méthode faisant office de second constructeur (exemple_19)

En PHP 5, il n'est pas possible d'avoir plusieurs constructeurs avec des paramètres différents qui permettraient de construire un objet de diverses façons. On peut alors utiliser des méthodes faisant office de constructeur :

 
CacherSélectionnez

Résultats :

 
CacherSélectionnez

Commentaires

  • lignes 26-29 : la méthode initWithPersonne permet d'affecter à l'objet courant les valeurs des attributs d'un autre objet Personne. Ici, elle fait appel au constructeur __construct mais ce n'est pas obligatoire.

VI-G. Un tableau d'objets Personne (exemple_20)

L'exemple suivant montre qu'on peut avoir des tableaux d'objets.

 
CacherSélectionnez

Résultats :

 
CacherSélectionnez

Commentaires

  • ligne 39 : création d'un tableau de 2 personnes
  • ligne 42 : parcours du tableau
  • ligne 43 : $groupe[$i] est un objet de type Personne. La méthode __toString est utilisée pour l'afficher.

VI-H. Création d'une classe dérivée de la classe Personne (exemple_21)

 
CacherSélectionnez

Résultats :

 
CacherSélectionnez

Commentaires

  • lignes 3-35 : la classe Personne
  • ligne 38 : la classe Enseignant dérive (extends) de la classe Personne. La classe dérivée Enseignant hérite des attributs et des méthodes de sa classe mère.
  • ligne 41 : la classe Enseignant ajoute un nouvel attribut discipline qui lui est propre
  • ligne 55 : le constructeur de la classe Enseignant reçoit 4 paramètres
  • 3 pour initialiser sa classe parent (prénom, nom, âge)
  • 1 pour sa propre initialisation (discipline)
  • ligne 57 : la classe dérivée a accès aux méthodes et constructeurs de sa classe parent via le mot clé parent ::. Ici on passe les paramètres (prénom, nom, âge) au constructeur de la classe parent.
  • ligne 64 : la méthode __toString de la classe dérivée utilise la méthode __toString de la classe parent.
  • ligne 71 : un tableau contenant un objet Enseignant et un objet Personne.
  • ligne 74 : on boucle sur les éléments du tableau
  • ligne 75 : la méthode __toString de chaque élément $groupe[$i] va être appelée. La classe Personne a une méthode __toString. La classe Enseignant en a deux : celle de sa classe parent et la sienne propre. On peut se demander laquelle va être appelée. L'exécution montre que c'est celle de la classe Enseignant qui a été appelée. C'est toujours ainsi : lorsqu'une méthode est appelée sur un objet, on cherche celle-ci dans l'ordre suivant : dans l'objet lui-même, dans sa classe parent s'il en a une, puis dans la classe parent de la classe parent, etc … La recherche s'arrête dès que la méthode a été trouvée.

VI-I. Création d'une seconde classe dérivée de la classe Personne (exemple_22)

L'exemple suivant crée une classe Etudiant dérivée de la classe Personne :

 
CacherSélectionnez

Résultats :

 
CacherSélectionnez

VI-J. Les interfaces (exemple_23)

Une interface est une structure définissant des prototypes de méthodes. Une classe implémentant une interface définit le code de toutes les méthodes de l'interface.

 
CacherSélectionnez

Résultats

 
CacherSélectionnez

Commentaires

  • lignes 4-8 : l'interface IExemple définit deux méthodes : la fonction ajouter (ligne 5) et la fonction soustraire (ligne 7). L'interface ne définit pas le code de ces méthodes. Ce sont les classes implémentant l'interface qui vont le faire.
  • ligne 11 : la classe Classe1 implémente (implements) l'interface IExemple. Elle définit donc un code pour les méthodes ajouter (ligne 13) et soustraire (ligne 17).
  • lignes 24-34 : idem pour la classe Classe2
  • ligne 37 : la méthode calculer admet trois paramètres : deux entiers $a et $b et un objet $interface implémentant l'interface IExemple. On aurait pu écrire function calculer($a,$b,$interface) sans indiquer le type IExemple du paramètre $interface. En l'indiquant, on permet à l'interpréteur PHP de vérifier que le paramètre effectif est bien un objet implémentant l'interface IExemple.
  • lignes 38-39 : utilisation des méthodes ajouter et soustraire de l'objet $interface. Parce que celui-ci implémente l'interface IExemple, on sait qu'il possède ces deux méthodes.
  • lignes 44-45 : création de deux objets de types différents mais implémentant tous deux l'interface IExemple.
  • ligne 47 : on passe à la fonction calculer, l'objet $c1 de type Classe1 implémentant l'interface IExemple.
  • ligne 48 : on passe à la fonction calculer, l'objet $c2 de type Classe2 implémentant l'interface IExemple.

précédentsommairesuivant

  

Licence Creative Commons
Le contenu de cet article est rédigé par Serge Tahé et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2011 Developpez.com.