Vous êtes sur la page 1sur 35

La programmation oriente objet

10/11/11 16:26

La programmation oriente objet


Il est possible de programmer en PHP de nombreuses faons diffrentes. C'est ce qui fait sa force : on peut en effet commencer crer ses premires pages basiques en PHP avec trs peu de connaissances au dpart, mais il est aussi possible de programmer avec des outils avancs, plus complexes mais aussi plus solides et plus flexibles. La programmation oriente objet est une technique de programmation clbre qui existe depuis des annes maintenant. PHP ne l'a pas invente : d'autres langages comme le C++, Java et Python l'utilisaient bien avant lui. La programmation oriente objet, que nous abrgerons POO, n'est pas le Saint Graal : elle ne va pas amliorer subitement la qualit de votre site par magie. En revanche, elle va vous aider mieux organiser votre code, le prparer de futures volutions et rendre certaines portions rutilisables pour gagner en temps et en clart. C'est pour cela que les dveloppeurs professionnels l'utilisent dans la plupart de leurs projets. Sommaire du chapitre :

Qu'est-ce qu'un objet ?


Je l'ai dit et je le rpte : la programmation oriente objet ne va pas instantanment rvolutionner votre site web, contrairement ce que beaucoup semblent penser. En fait, il est mme probable que cela vous semble un peu inutile au dbut et que vous vous disiez "Ok mais je n'en vois pas l'intrt, a marchait aussi bien avant". Certaines choses vous paratront aussi un peu abstraites, vous ne verrez peut-tre pas bien comment mettre tout cela en pratique sur votre site. C'est parfaitement normal, lorsqu'on apprend la programmation oriente objet il y a un petit temps d'adaptation pendant lequel on ne voit pas le rapport entre la thorie et la pratique.

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 1 sur 35

La programmation oriente objet

10/11/11 16:26

Prenez quand mme le temps de tout lire et de faire l'effort de comprendre ce qui est expliqu. Petit petit, en pratiquant, vous dcouvrirez que cela vous permet de mieux matriser votre code PHP au fur et mesure qu'il grossit, et vous verrez par la suite tout l'intrt de ce que vous aurez appris.

Ils sont beaux, ils sont frais mes objets

Nous allons commencer par dfinir ce qu'on appelle un objet en programmation. Alors, de quoi s'agit-il ?

Encore un concept mystique ? Un dlire de programmeurs aprs une soire trop arrose ? Non parce que franchement, un objet c'est quoi ? Mon cran est un objet, ma voiture est un objet, mon tlphone portable... ce sont tous des objets !

Bien vu, c'est un premier point. En effet, nous sommes entours d'objets. En fait, tout ce que nous connaissons (ou presque) peut tre considr comme un objet. L'ide de la programmation oriente objet, c'est de manipuler des lments que l'on appelle des "objets" dans son code source.

Mais concrtement, c'est quoi ? Une variable ? Une fonction ?

Ni l'un, ni l'autre. C'est un nouvel lment en programmation. Pour tre plus prcis, un objet c'est... un mlange de plusieurs variables et fonctions.

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 2 sur 35

La programmation oriente objet

10/11/11 16:26

Ne faites pas cette tte-l, vous allez dcouvrir tout cela par la suite.

Imaginez... un objet

Pour viter que ce que je vous raconte ressemble un trait d'art moderne conceptuel, on va imaginer ensemble ce qu'est un objet l'aide de plusieurs schmas concrets. Les schmas 3D que vous allez voir par la suite ont t raliss pour moi par Nab, que je remercie d'ailleurs vivement au passage.

Imaginez qu'un programmeur dcide un jour de crer une section de son site web qui permet d'ajouter des membres, de les placer dans des groupes (administrateur, modrateur...), de les bannir, de les supprimer... Le code est complexe : il a besoin de crer plusieurs fonctions qui s'appellent entre elles, des variables pour mmoriser le nom du membre, sa date d'inscription, son groupe, etc. Il met du temps crire ce code, c'est un peu compliqu, mais il y arrive. Au final, le code qu'il a crit est compos de plusieurs fonctions et variables. Quand on regarde a pour la premire fois, a ressemble une exprience de savant fou laquelle on ne comprend rien :

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 3 sur 35

La programmation oriente objet

10/11/11 16:26

Ce programmeur est content de son code et veut le distribuer sur internet pour que tout le monde puisse crer sa section membres sur son site sans avoir tout recoder. Seulement voil, moins d'tre un expert en chimie certifi, vous allez mettre pas mal de temps avant de comprendre comment tout ce bazar fonctionne. Quelle fonction appeler en premier ? Quelles valeurs envoyer quelle fonction pour crer le membre ? C'est l que notre ami programmeur pense nous. Il conoit son code de manire oriente objet. Cela signifie qu'il place tout son bazar chimique l'intrieur d'un simple cube. Ce cube est ce qu'on appelle un objet :

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 4 sur 35

La programmation oriente objet

10/11/11 16:26

Ici, une partie du cube a t volontairement mise en transparence pour vous montrer que nos fioles chimiques sont bien situes l'intrieur du cube. Mais en ralit, le cube est compltement opaque, on ne voit rien de ce qu'il y a l'intrieur :

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 5 sur 35

La programmation oriente objet

10/11/11 16:26

Ce cube contient toutes les fonctions et les variables (nos fioles de chimie), mais il les masque l'utilisateur. Au lieu d'avoir des tonnes de tubes et fioles chimiques dont il faut comprendre le fonctionnement, on nous propose juste quelques boutons sur la face avant du cube : un bouton "crer un membre", un bouton "bannir", etc. L'utilisateur n'a plus qu' se servir des boutons du cube et n'a plus besoin de se soucier de tout ce qui se passe l'intrieur. Pour l'utilisateur, c'est donc compltement simplifi. En clair : programmer de manire oriente objet, c'est crer du code source (peut-tre complexe), mais que l'on masque en le plaant l'intrieur d'un cube (un objet) travers lequel on ne voit rien. Pour le programmeur qui va l'utiliser, travailler avec un objet est donc beaucoup plus simple qu'avant : il a juste appuyer sur des boutons et n'a pas besoin d'tre diplm en chimie pour s'en servir. Bien sr, c'est une image, mais c'est ce qu'il faut comprendre et retenir pour le moment.

Vous avez dj utilis des objets !

Eh oui ! Vous vous souvenez de PDO ? Ne me dites pas que vous avez dj oubli. PDO est une extension de PHP et elle est code en orient objet. C'est ce qui explique que son mode d'emploi tait lgrement diffrent des fonctions auxquelles nous tions habitus. Je vous avais promis de vous expliquer plus en dtail comment fonctionnait
http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 6 sur 35

La programmation oriente objet

10/11/11 16:26

PDO, c'est maintenant l'occasion idale ! Souvenez-vous de cette ligne qui nous permettait de nous connecter la base de donnes : Code : PHP - Slectionner
<?php $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options); ?>

$bdd n'est en fait pas une variable mais un objet. On cre un objet l'aide de la commande new suivie du nom de la classe.

Classe ? Objet ? Quelle est la diffrence ?

La classe est un plan, une description de l'objet. Imaginez qu'il s'agit par exemple des plans de construction d'une maison. L'objet est une instance de la classe, c'est--dire une application concrte du plan. Pour reprendre l'exemple prcdent, l'objet est la maison. On peut crer plusieurs maisons bases sur un plan de construction. On peut donc crer plusieurs objets partir d'une classe.

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 7 sur 35

La programmation oriente objet

10/11/11 16:26

Par consquent, si on reprend le code prcdent, vous aurez devin que :

$bdd est l'objet PDO est le nom de la classe sur laquelle est bas l'objet

Un objet est, je vous le disais plus tt, un mlange de fonctions et de variables. Lorsqu'on l'utilise, on fait appel ses fonctions : Code : PHP - Slectionner
<?php $bdd->query(); $bdd->prepare(); $bdd->execute(); ?>

Cela signifie : excuter la fonction query() de mon objet $bdd, puis la fonction
http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 8 sur 35

La programmation oriente objet

10/11/11 16:26

prepare(), puis la fonction execute(), etc. La flche -> est propre aux objets. Il faut donc comprendre que l'on excute la fonction query() de l'objet $bdd qui reprsente la connexion la base de donnes. Autre exemple, imaginaire cette fois, pour tre sr que vous compreniez bien : Code : PHP - Slectionner
<?php $maison1 = new Maison(); $maison2 = new Maison(); $maison1->nettoyer(); ?>

Ici, nous avons plusieurs objets reprsentant des maisons ($maison1 et $maison2), mais nous n'appelons que la fonction nettoyer() de la maison 1, donc c'est la seule qui sera propre. Un des avantages de la programmation oriente objet comme vous le voyez, c'est sa lisibilit. Ce code est facile lire et comprendre. Nous allons maintenant apprendre dans la suite de ce chapitre crer nos propres classes.

Crer une classe


Pour nos exemples, nous allons imaginer que nous crons une classe Membre qui reprsente un membre de notre site. Nous pourrons charger ce membre partir des informations enregistres en base de donnes, lui demander son pseudonyme, sa date d'inscription, mais aussi le bannir, le dconnecter du site, etc. Le code d'une classe tant en gnral assez long, il est recommand de crer un fichier PHP qui contiendra uniquement la dfinition de la classe et que l'on inclura chaque fois qu'on en a besoin. Je vous recommande de crer un fichier
http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 9 sur 35

La programmation oriente objet

10/11/11 16:26

nomm Membre.class.php.

Les dveloppeurs PHP ont l'habitude de donner l'extension .class.php leurs fichiers contenant des classes pour bien les distinguer. Quelques rgles ce sujet : ne dfinissez qu'une classe par fichier et donnez au fichier le mme nom que votre classe. Le nom de votre classe devrait par ailleurs commencer par une majuscule.

Dans ce fichier Membre.class.php, commencez par inscrire le code suivant : Code : PHP - Slectionner
<?php class Membre { } ?>

Etant donn que notre fichier ne contiendra que du code PHP, il est possible (et mme recommand par des dveloppeurs expriments !) de retirer la balise de fermeture ?> la fin du fichier. Cela peut paratre surprenant, mais c'est en fait un moyen efficace d'viter d'insrer des lignes blanches la fin du code PHP, ce qui a tendance produire des bugs du type "Headers already sent by".

A l'intrieur des accolades, nous allons dfinir des variables et des fonctions membres de la classe. Un point vocabulaire ce sujet : certains dveloppeurs utilisent d'autres mots pour dsigner les variables et fonctions membres des classes. Les voici :

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 10 sur 35

La programmation oriente objet

10/11/11 16:26

Variables membres : aussi appeles attributs ou proprits Fonctions membres : aussi appeles mthodes

Essayons maintenant de dfinir ensemble quelques variables et fonctions dans la classe Membre.

Les variables membres

Les variables permettent de dfinir l'objet, c'est ce qui fait qu'il sera unique. Alors, qu'est-ce qui reprsente un membre ? Essayons de dfinir quelques-unes de ses proprits (si on en oublie ce n'est pas grave, on pourra toujours en rajouter par la suite). Un membre a :

Un pseudonyme Un e-mail Une signature Un statut (actif ou non, selon que son compte a t valid ou banni)

Nous allons stocker toutes ces informations dans des variables sous forme de texte. Compltez votre classe en rajoutant ces variables : Code : PHP - Slectionner
<?php class Membre { private $pseudo; private $email; private $signature; private $actif;
http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 11 sur 35

La programmation oriente objet

10/11/11 16:26

} ?>

Nous indiquons que notre classe Membre est compose de 4 variables : $pseudo, $email, $signature et $actif. Pour l'instant, elles ne possdent pas de valeur. Ne vous proccupez pas pour l'instant du mot-cl private devant ces noms de variables, je vous expliquerai un peu plus loin ce que cela signifie.

Les fonctions membres

Maintenant que nous avons dfini les variables, nous pouvons crer quelques fonctions. Leur rle sera :

Soit de lire ou mettre jour les variables. On parle de fonctions getters et setters. Soit d'excuter des actions plus complexes sur le membre (comme lui envoyer un email).

Les getters et setters

Ce sont des fonctions qui commencent par get ou par set, selon si on veut rcuprer le contenu d'une variable ou le modifier. Prenons par exemple le pseudonyme, on va crer une fonction getPseudo qui
http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 12 sur 35

La programmation oriente objet

10/11/11 16:26

renvoie le pseudo et setPseudo qui modifie le pseudo. Code : PHP - Slectionner


1 <?php 2 class Membre 3{ 4 private $pseudo; 5 private $email; 6 private $signature; 7 private $actif; 8 9 public function getPseudo() 10 { 11 return $this->pseudo; 12 } 13 14 public function setPseudo($nouveauPseudo) 15 { 16 $this->pseudo = $nouveauPseudo; 17 } 18 }

Nous avons donc 2 fonctions qui permettent de manipuler le pseudonyme du visiteur. Elles sont vraiment trs simples comme vous le voyez. Ainsi, getPseudo renvoie le pseudo : Code : PHP - Slectionner
<?php public function getPseudo() { return $this->pseudo; } ?>

La variable $pseudo est accessible dans les fonctions avec le prfixe $this->. Cela signifie "Le pseudo de cet objet". En effet, souvenez-vous, on peut crer plusieurs objets partir d'une classe. Il peut y avoir plusieurs membres et chacun d'eux a un pseudo diffrent. Le prfixe $this-> permet d'indiquer que c'est
http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 13 sur 35

La programmation oriente objet

10/11/11 16:26

bien le pseudonyme du membre sur lequel on travaille que l'on veut rcuprer. On fait de mme avec une fonction setPseudo qui prend en paramtre le nouveau pseudo du membre et qui le place dans $this->pseudo.

Ces fonctions sont trs simples et un peu inutiles non ?

En fait, les getters et setters sont souvent des fonctions simples, mais l'intrt est qu'on peut faire des calculs et des vrifications sur les donnes. Par exemple, on pourrait amliorer la fonction setPseudo comme ceci : Code : PHP - Slectionner
1 <?php 2 public function setPseudo($nouveauPseudo) 3{ 4 // Vrifier si le nouveau pseudo n'est pas vide ou trop long 5 if (!empty($nouveauPseudo) AND strlen($nouveauPseudo) < 15) 6 { 7 // Ok on change son pseudo 8 $this->pseudo = $nouveauPseudo; 9 } 10 } 11 ?>

Ainsi, on autorise le changement de pseudonyme uniquement s'il correspond certains critres : pseudo non vide et longueur infrieure 15 caractres. On pourrait profiter de cette fonction pour vrifier aussi la prsence de caractres non autoriss. L'intrt de passer par une fonction pour modifier les variables est donc de pouvoir contrler que l'on n'insre pas n'importe quoi. Pour l'e-mail, on pourrait ainsi vrifier que celui-ci a la forme d'un vritable e-mail.

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 14 sur 35

La programmation oriente objet

10/11/11 16:26

Les autres fonctions

Bien entendu, nous pouvons introduire n'importe quel autre type de fonction dans la classe Membre, pas seulement des fonctions qui se contentent de modifier les variables. A nous de dcider quelles actions on veut pouvoir effectuer sur le membre : le bannir, lui envoyer un e-mail... Code : PHP - Slectionner
<?php 1 class Membre 2 { 3 public function envoyerEMail($titre, $message) 4 { 5 mail($this->email, $titre, $message); 6 } 7 8 public function bannir() 9 { 10 $this->actif = false; 11 $this12 >envoyerEMail('Vous avez t banni', 'Ne revenez plus !'); 13 } 14 15 ... 16 } 17 ?>

La fonction envoyerEMail est toute simple : elle utilise la fonction mail() de PHP qui permet d'envoyer un e-mail ainsi que l'adresse e-mail stocke dans l'objet ($this->email). D'autre part, la fonction bannir() change le statut actif du membre pour indiquer qu'il n'est plus actif et lui envoie un e-mail pour l'avertir de son bannissement. On en profite pour rutiliser la fonction envoyerEMail() de notre classe. Vous remarquerez qu'on doit placer l aussi le prfixe $this-> devant le nom
http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 15 sur 35

La programmation oriente objet

10/11/11 16:26

d'une fonction de la classe qu'on appelle. C'est dans l'esprit de la programmation oriente objet : on rutilise du code dj crit pour viter de rinventer la roue chaque fois.

Crer un objet partir de la classe


Actuellement, vous devriez avoir un fichier Membre.class.php qui contient la dfinition de la classe, c'est--dire les plans de construction de vos futurs objets : Code : PHP - Slectionner
<?php 1 class Membre 2{ private $pseudo; 3 private $email; 4 private $signature; 5 private $actif; 6 7 public function envoyerEMail($titre, $message) 8 { 9 mail($this->email, $titre, $message); 10 } 11 12 public function bannir() 13 { 14 $this->actif = false; 15 $this->envoyerEMail('Vous avez t banni', 'Ne revenez 16 17 plus !'); } 18 19 public function getPseudo() 20 { 21 return $this->pseudo; 22 } 23 24 public function setPseudo($nouveauPseudo) 25 { 26 if (!empty($nouveauPseudo) AND strlen($nouveauPseudo) < 27 28 15) { 29
http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 16 sur 35

La programmation oriente objet

10/11/11 16:26

30 31 32 33 } ?>

$this->pseudo = $nouveauPseudo; } }

Maintenant que la classe est prte (mme si on peut encore l'amliorer), on peut commencer l'utiliser et donc crer des objets. Crez un nouveau fichier (que vous appellerez comme vous voulez, par exemple index.php), dans lequel vous allez crer et utiliser un objet de type Membre. Code : PHP - Slectionner
1 <?php 2 3 include_once('Membre.class.php'); 4 5 $membre = new Membre(); 6 $membre->setPseudo('M@teo21'); 7 echo $membre->getPseudo() . ', je vais te bannir !'; 8 $membre->bannir(); 9 10 ?>

On commence par inclure la dfinition de la classe Membre situe dans le fichier Membre.class.php. On utilise la fonction include_once() qui nous assure que le fichier n'a pas dj t inclus ailleurs dans la page, ce qui aurait provoqu une erreur car il est interdit de dfinir deux fois une mme classe. On cre ensuite un nouvel objet de type Membre avec la ligne : Code : PHP - Slectionner
<?php $membre = new Membre(); ?>

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 17 sur 35

La programmation oriente objet

10/11/11 16:26

Nous avons maintenant un objet $membre qui reprsente un membre vide. On lui dfinit ensuite un pseudo, on l'affiche, puis pour s'amuser on le bannit.

Ne confondez pas la classe et l'objet. La classe commence avec un "M" majuscule, tandis que l'objet avec un "m" minuscule. Nous aurions d'ailleurs pu donner n'importe quel nom notre objet ($mateo, $nouveauVenu...), mais faute de trouver de meilleur nom j'ai utilis le mme nom que la classe, avec la premire lettre en minuscule pour les diffrencier.

Vous avez donc l un exemple d'utilisation concrte de la classe. Bien que celleci soit basique, vous pourriez dj donner ce fichier Membre.class.php des amis programmeurs, accompagn de prfrence d'une petite documentation qui explique comment l'utiliser, et vos amis pourront comme vous crer et manipuler des membres. Une classe, c'est donc un peu un package prt l'emploi. Elle contient son lot de variables et de fonctions. Pour l'utiliser, nous faisons tout simplement appel ses fonctions sans nous soucier de ce qu'elles font l'intrieur. Cela rejoint donc le schma que je vous avais prsent au dbut de ce chapitre :

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 18 sur 35

La programmation oriente objet

10/11/11 16:26

Les variables et le code des fonctions n'intressent pas le programmeur qui utilise la classe. Il se contente simplement d'appuyer sur des boutons, c'est--dire d'appeler les fonctions dont il a besoin pour manipuler son membre : "Donnelui le pseudo M@teo21", "Bannis-le", etc.

Constructeur, destructeur et autres fonctions spciales


En plus des fonctions que nous avons cres dans notre classe Membre, il existe un certain nombre de fonctions "spciales" connatre. On les appelle fonctions magiques ou encore mthodes magiques. On les reconnat facilement car leur nom commence par deux underscores (tiret bas, sous le chiffre 8 d'un clavier AZERTY franais). Par exemple : __construct, __destruct, __get, etc. Nous allons nous intresser plus particulirement ici aux deux plus importantes d'entre elles : le constructeur et le destructeur.

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 19 sur 35

La programmation oriente objet

10/11/11 16:26

Le constructeur : __construct

Lorsque vous crez un objet, comme nous l'avons fait prcdemment, celui-ci est vide au dpart. Ses variables membres ne contiennent rien. Ainsi notre membre n'avait pas de pseudo, pas d'e-mail, rien. Code : PHP - Slectionner
<?php $membre = new Membre(); // Le membre est vide ?>

Or, quand vous crez un objet comme ceci avec new, il faut savoir que PHP recherche l'intrieur de la classe une fonction nomme __construct. Jusqu'ici nous n'en avions pas cr, donc faute d'en trouver PHP crait un objet vide. Le rle d'une fonction constructeur est justement de construire l'objet (non, sans blague !), c'est--dire de le prparer une premire utilisation. Dans notre cas, on aimerait par exemple charger en base de donnes les informations concernant le membre et insrer les bonnes valeurs dans les variables ds le dpart. Code : PHP - Slectionner
1 <?php 2 class Membre 3{ public function __construct($idMembre) 4 { 5 // Rcuprer en base de donnes les infos du membre 6 // SELECT pseudo, email, signature, actif FROM membres 7 8 WHERE id = ... 9 // Dfinir les variables avec les rsultats de la base 10 $this->pseudo = $donnees['pseudo']; 11 $this->email = $donnees['email']; 12 // etc. 13
http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 20 sur 35

La programmation oriente objet

10/11/11 16:26

14 15 16 ?>

} ...

Notre fonction constructeur prend un paramtre : l'id du membre. On peut partir de l charger en base de donnes les informations concernant le membre et les insrer dans l'objet : $this->pseudo, $this->email... Comme notre constructeur prend un paramtre, il faudra dsormais crer nos objets en envoyant un id : Code : PHP - Slectionner
<?php $membre = new Membre(32); // Le membre n32 est charg ! ?>

Notre membre n32 est maintenant prt ! Il contient dj le bon pseudonyme, le bon e-mail, etc. A vous de faire en sorte ensuite, lorsqu'on modifie son pseudo par exemple, que ce changement soit bien rpercut en base de donnes.

Le destructeur : __destruct

Moins couramment utilis, le destructeur peut nanmoins se rvler utile. Cette fonction est appele automatiquement par PHP lorsque l'objet est dtruit.

Mais quand l'objet est-il dtruit ?

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 21 sur 35

La programmation oriente objet

10/11/11 16:26

Pour dtruire un objet, ou toute autre variable, on peut le faire la main avec la fonction unset() : Code : PHP - Slectionner
<?php unset($membre); ?>

Si vous ne le faites pas, l'objet sera dtruit la fin de l'environnement dans lequel il a t cr. Si l'objet a t cr dans la page (comme c'tait le cas dans index.php), il sera supprim la fin de l'excution de la page. C'est alors que le destructeur est appel. Son rle est de raliser toutes les oprations ncessaires pour mettre fin la vie de l'objet. La classe PDO, par exemple, a besoin d'utiliser le destructeur pour fermer la connexion la base de donnes. Elle envoie alors un signal la base de donnes "Fin de la connexion". Dans le cas de notre classe Membre, il n'y aurait rien de spcial faire a priori. Nanmoins, pour tester le fonctionnement du destructeur, vous pouvez en crer un qui affiche un message signalant que l'objet va tre dtruit : Code : PHP - Slectionner
<?php public function __destruct() { echo 'Cet objet va tre dtruit !'; } ?>

Vous verrez que ce message apparat la fin de la page dans notre cas. Si vous avez cr plusieurs objets, vous verrez autant de messages qu'il n'y a d'objets,
http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 22 sur 35

La programmation oriente objet

10/11/11 16:26

car chacun d'eux va tre dtruit !

Les autres fonctions magiques

Il existe de nombreuses autres fonctions magiques dont l'utilit est cependant moins importante : __get(), __set(), __call(), __sleep(), __wakeup()... Elles permettent de contrler certaines autres tapes de la vie de votre objet. Nous ne les dtaillerons pas ici mais si vous voulez en savoir plus sur elles, vous pouvez lire la page de la documentation qui prsente les fonctions magiques.

L'hritage
L'hritage est probablement le concept le plus important de la programmation oriente objet. C'est ce qui lui donne toute sa puissance. Cela permet de rutiliser des classes pour construire d'autres classes. On se sert de certaines classes "de base" pour construire des classes plus compltes.

Comment reconnatre un hritage ?

C'est LA question se poser. Certains ont tellement t traumatiss par l'hritage en cours de programmation qu'ils en voient partout, d'autres au contraire (surtout les dbutants) se demandent chaque fois s'il y a un hritage faire ou pas. Pourtant, ce n'est pas "mystique", il est trs facile de savoir s'il y a une relation d'hritage entre 2 classes. Comment ? En suivant cette rgle trs simple :

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 23 sur 35

La programmation oriente objet

10/11/11 16:26

Il y a hritage quand on peut dire : "A est un B"

Pas de panique c'est pas des maths. Prenez un exemple trs simple. On peut dire "Un administrateur est un membre", ou encore "Un modrateur est un membre". Donc on peut faire un hritage : "La classe Admin hrite de Membre", "La classe Moderateur hrite de Membre". Pour vous imprgner, voici quelques autres bons exemples o un hritage peut tre fait :

Une voiture est un vhicule (Voiture hrite de Vehicule) Un bus est un vhicule (Bus hrite de vhicule) Un moineau est un oiseau (Moineau hrite d'Oiseau) Un corbeau est un oiseau (Corbeau hrite d'Oiseau) Un chirurgien est un docteur (Chirurgien hrite de Docteur) Un diplodocus est un dinosaure (Diplodocus hrite de Dinosaure) etc.

En revanche, vous ne pouvez pas dire "Un dinosaure est un diplodocus", ou encore "Un bus est un oiseau". Donc on ne peut pas faire d'hritage dans ces cas-l, du moins a n'aurait aucun sens.

Raliser un hritage en PHP

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 24 sur 35

La programmation oriente objet

10/11/11 16:26

Nous allons crer une nouvelle classe Admin qui sera base sur la classe Membre. Elle aura toutes les variables et fonctions de la classe Membre, mais elle aura en plus de nouvelles variables et fonctions. Crez un fichier Admin.class.php (souvenez-vous, on fait un fichier par classe !) et insrez-y le code suivant pour commencer : Code : PHP - Slectionner
<?php include_once('Membre.class.php'); class Admin extends Membre { } ?>

Le nouveau mot-cl ici est extends, qui signifie "tend". Traduction : la classe Admin tend [les possibilits de] la classe Membre. C'est cela l'hritage : nous avons maintenant une classe Admin qui possde toutes les variables et fonctions de Membre, et nous allons pouvoir en dfinir de nouvelles qui seront propres aux admins.

Pour que PHP connaisse la classe Membre afin de permettre l'hritage, il est impratif d'inclure le fichier Membre.class.php au pralable.

Rajoutons maintenant des fonctionnalits qui seront propres aux admins. Par exemple, ceux-ci, grce leurs privilges, peuvent choisir la couleur dans laquelle sera crit leur pseudonyme. Ils ont donc une variable $couleur et des fonctions qui permettent de la lire et de la modifier : Code : PHP - Slectionner
http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 25 sur 35

La programmation oriente objet

10/11/11 16:26

1 <?php 2 include_once('Membre.class.php'); 3 4 class Admin extends Membre 5{ 6 private $couleur; 7 8 public function setCouleur() 9 { 10 // ... 11 } 12 13 public function getCouleur() 14 { 15 // ... 16 } 17 } 18 ?>

Nous avons donc maintenant 2 classes : Membre et Admin. Avec Membre, on peut manipuler un pseudo, un e-mail, une signature et un tat actif ou non. Avec Admin, on peut manipuler les mmes choses : un pseudo, un e-mail, une signature et un tat actif ou non... mais aussi de nouvelles proprits, comme la couleur du pseudo.

Dans notre fichier index.php on peut maintenant crer des membres mais aussi des admins : Code : PHP - Slectionner
<?php 1 $membre = new Membre(31); // Contient un pseudo, un e-mail... 2 $maitreDesLieux = new Admin(2); // Contient les mmes donnes 3 qu'un membre + la couleur
http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 26 sur 35

La programmation oriente objet

10/11/11 16:26

4 5 $membre->setPseudo('Arckintox'); // OK 6 $maitreDesLieux->setPseudo('M@teo21'); // OK 7 8 $membre->setCouleur('Rouge'); // Impossible (un membre n'a pas 9 de couleur) 10 $maitreDesLieux->setCouleur('Rouge'); // OK ?>

Avec peu d'efforts, nous avons cr une nouvelle classe qui rutilise une classe existante. On peut donc appeler la fonction setPseudo comme pour les membres, et on peut en plus effectuer de nouvelles oprations comme dfinir une couleur de pseudo.

Les droits d'accs et l'encapsulation


Pour terminer notre dcouverte de la programmation oriente objet, il me reste vous prsenter un concept trs important : l'encapsulation. En effet, il y a beaucoup de rgles en POO et personne ne vous oblige les suivre. Elles paraissent parfois lourdes et un peu contraignantes. Cela fait que certains finissent par mal programmer en POO. Pourtant, s'il y a une rgle suivre en POO c'est bien l'encapsulation. Avant de vous expliquer ce que cette rgle raconte, je dois cependant vous prsenter le principe des droits d'accs.

Les droits d'accs

Vous vous souvenez de ces petits mots que nous avons utiliss devant nos noms de variables et fonctions dans ce chapitre ? Oui, je fais rfrence public et private. Ce sont ce qu'on appelle des droits d'accs : cela permet d'indiquer si l'utilisateur de la classe a le droit d'accder directement un lment de la
http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 27 sur 35

La programmation oriente objet

10/11/11 16:26

classe ou non. Il y a 3 droits d'accs connatre : public : tout le monde peut accder l'lment. private : personne ( part la classe elle-mme) n'a le droit d'accder l'lment. protected : identique private, mais les classes qui hriteront de celles-ci (les classes filles) auront quand mme accs l'lment.

Essayons de traduire tout a en mots franais voulez-vous ! Reprenons une version simple de notre classe Membre : Code : PHP - Slectionner
1 <?php 2 class Membre 3{ 4 private $pseudo; 5 private $email; 6 private $signature; 7 private $actif; 8 9 public function getPseudo() 10 { 11 12 } 13 14 public function setPseudo($nouveauPseudo) 15 { 16 17 } 18 } 19 ?>

Ici, vous voyez que les fonctions sont publiques et les variables sont prives.
http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 28 sur 35

La programmation oriente objet

10/11/11 16:26

Rien ne nous empche cependant de faire l'inverse, mme si ce n'est vraiment pas conseill pour les variables comme nous allons le voir. Qu'est-ce que cela signifie concrtement ? Que la personne qui utilise la classe travers des objets (dans index.php par exemple) peut uniquement accder ce qui est public et pas ce qui est priv : Code : PHP - Slectionner
<?php $membre = new Membre(4); $membre->setPseudo('M@teo21'); // OK car setPseudo est public $membre->pseudo = 'M@teo21'; // Interdit car $pseudo est private ?>

C'est donc vous qui dfinissez avec ces public, private ou protected si l'utilisateur a le droit ou non d'appeler la fonction ou la variable.

Et protected justement, a correspond quoi ?

C'est identique private mais il y a une diffrence lorsqu'on hrite de la classe. Par exemple, si on dfinit la variable $email comme protected dans la classe Membre, cela signifie que les classes qui en hritent (comme Admin) auront le droit d'y accder. Sinon, en private, elles n'auraient pas pu les appeler directement.

L'encapsulation

Pourquoi est-ce qu'on s'embte avec a ? Et si on mettait tout en public ? On se


http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 29 sur 35

La programmation oriente objet

10/11/11 16:26

prendrait moins la tte non ?

Si tout tait public, mme les variables membres, n'importe qui pourrait faire : Code : PHP - Slectionner
<?php $membre = new Membre(4); $membre->email = 'Portnawak'; ?>

Or, "Portnawak" n'est pas un vritable e-mail, je pense que vous serez d'accord avec moi. Pour viter qu'on puisse faire n'importe quoi avec ses objets, on a invent une rgle trs simple qui s'appelle la rgle d'encapsulation. On peut la rsumer comme ceci :

Toutes les variables d'une classe doivent toujours tre prives ou protges Et si vous voulez modifier des variables vous devez passer par des fonctions setVariable, na !

Voil pourquoi on prend l'habitude de crer des fonctions get et set : cela nous permet de vrifier qu'on ne fait pas n'importe quoi avec les variables, comme dfinir un e-mail invalide. Il arrive en revanche que l'on dfinisse des fonctions membres prives. Ce sont des fonctions internes la classe que l'utilisateur n'a pas appeler directement.

Il est recommand en gnral d'utiliser plutt protected que private, surtout si


http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 30 sur 35

La programmation oriente objet

10/11/11 16:26

vous pensez hriter de la classe. En effet, leur fonctionnement est le mme mais protected est plus souple si vous avez un jour des classes filles.

Le but de l'encapsulation est de masquer la personne qui utilise la classe son fonctionnement interne. Quand vous crez un objet, vous ne devez pas avoir vous soucier des variables qu'il contient, de la faon dont celles-ci sont agences, etc. Vous tes juste une personne qui appuie sur des boutons pour effectuer des actions sur l'objet (revoir mes schmas du dbut du chapitre). Vous devez donc passer par des fonctions pour modifier vos objets. Pour forcer l'utilisateur "appuyer sur les boutons" plutt que de "toucher aux fioles chimiques dangereuses qu'il ne comprend pas", on utilise les droits d'accs. Ainsi, les fonctions sont pour la plupart publiques (sauf celles qui servent au fonctionnement interne de la classe) et les variables sont toujours prives ou protges pour que l'utilisateur ne puisse pas mettre n'importe quoi l'intrieur. Si vous retenez et comprenez ce principe, alors vous serez sur la bonne voie pour bien programmer en orient objet. Notre prsentation de la programmation oriente objet en PHP s'achve ici. Nous avons fait le tour de la plupart des fonctionnalits de base, mais la POO permet d'aller plus loin. Comme il faudrait un cours entier pour tout dcouvrir, je vous recommande vivement la lecture du tutoriel de vyk12 spcialement ddi la POO en PHP. Vous y dcouvrirez de nouvelles informations sur l'hritage, mais aussi de nouveaux concepts comme les design patterns, les interfaces, les exceptions, etc. Comme je vous le disais au dbut, tout ceci doit vous paratre encore pas mal abstrait. Je sais ce que vous ressentez : un mlange de frustration et probablement de fascination pour quelque chose que vous ne comprenez pas encore
http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html Page 31 sur 35

La programmation oriente objet

10/11/11 16:26

vraiment. J'ai fait de mon mieux dans ce chapitre pour tre le plus concret possible, mais c'est par la pratique que vous comprendrez le mieux. Un peu de patience.
Informations sur le tutoriel
Retour en haut Cr : Le 19/07/2005 23:21:44 Modifi : Le 03/04/2010 14:48:23 Avancement : 100% 47 commentaires

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 32 sur 35

La programmation oriente objet

10/11/11 16:26

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 33 sur 35

La programmation oriente objet

10/11/11 16:26

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 34 sur 35

La programmation oriente objet

10/11/11 16:26

http://www.siteduzero.com/tutoriel-3-232176-la-programmation-orientee-objet.html

Page 35 sur 35

Vous aimerez peut-être aussi