Vous êtes sur la page 1sur 25

Programmation Oriente Objets en PHP

www.moteurprog.com

Partie 1 : I ntroduction

1. I ntroduction
1.1 I mplmentation en PHP

La notion d'objet dans le langage du PHP un aspect trs limit contrairement au langages de
rfrence tel que le C++, dans cet article, je vais essay de vous expliquer son implmentation
dans le PHP, et comment l'utiliser.

1.2 Concept Objet

Le concept objet doit tre pris dans le sens de "module", sous ce nom, se cache un ensemble
de commandes visant excuter des actions, un objet est une entit, un peu comme si l'on
voulait diviser notre programme en sous-tches.

1.3 Avantages

Beaucoup d'avantages donnent raisons l'utilisation des classes, rutilisation du code plus
facile, traitement des informations part, cela rduit aussi considrablement le temps de
travail, car vous incluez votre classe dans tous les programmes qui vont l'utiliser au lieu de la
rcrire.

1.4 Acquis

Dans cet article, je considrerais que vous avez de bonnes bases en PHP, ce tutorial s'adresse
nanmoins surtout aux dbutants.

2. Thorie
2.1 Thermes

La programmation objet utilise un vocabulaire particulier :
Vocabulaire du concept Objet en PHP
objet
Reprsentant de la classe dans l'application, il se nomme
instance de classe.
classe Entit contenant toutes les mthodes et attributs.
mthode Nom donn aux fonctions contenu dans la classe.
attribut
Nom donn aux variables globales de la classe, dfinis aux
dbut.
constructeur
Nom donn la mthode lanc lors de l'instanciation de la
classe, elle porte le mme nom que la classe.
destructeur
Nom donn la mthode lanc lors de la destruction de la
classe, cet notion, n'existe pas vraiment dans
l'implmentation du concept objet en PHP.

2.2 Classe

Pour introduire une classe dans un programme vous devez utiliser :
class nom_classe
{
//...
}
La spcification des attributs se fait au dbut :
class nom_classe
{
// Variable sans valeur
var $variable1;
// Variable avec valeur
var $variable2 = "Variable 2";
// Tableau
var $tableau = array();
//...
}

Comme vous pouvez le voir, on utilise le mot cl var pour introduire un attribut, vous pouvez
laissez cette variable indfinie, ou lui donner une valeur.
Introduction du constructeur (facultatif) :

class nom_classe
{
// Variable sans valeur
var $variable1;
// Variable avec valeur
var $variable2 = "Variable 2";
// Tableau
var $tableau = array();

// Le constructeur de la classe
function nom_classe ($var, $autre_var)
{
//...
}
}

Le constructeur est une mthode lanc lors de l'encapsulation (instanciation) de la classe, cette
mthode est facultative.
Inclusion d'autres mthodes :

class nom_classe
{
// Variable sans valeur
var $variable1;
// Variable avec valeur
var $variable2 = "Variable 2";
// Tableau
var $tableau = array();

// Le constructeur de la classe
function nom_classe ($var, $autre_var)
{
//...
}

// Fonction1
function Fonction1 ()
{
//...
}
// fonction2
function fonction2 ($var)
{
//...
}
}

La dfinition de mthodes dans une classe se fait de la mme manire que les fonctions dans
le code source PHP, j'en profite pour rappeler que PHP est sensible la casse
(majuscule/minuscule).

2.2 Code source

Voyons maintenant ce qui se passe du ct de votre script PHP qui va utiliser votre classe
nouvellement crer :

<?php

// Cration d'une instance de la classe nom_classe et lancement de la
// fonction de construction (le constructeur)
$objet = new nom_classe ("valeur, valeur2");
// Vous l'avez remarqu, $objet est l'objet !

// Dfinition de la variable $variable1
$objet->variable1 = "Variable 1";

// Lancement de la fonction fonction2()
$objet->fonction2 ("valeur");

?>

On commence tout d'abord par crer une nouvelle instance de la classe nom_classe l'aide du
mot-cl new, par la mme occasion, la fonction du mme nom que la classe (le constructeur)
est lanc, le constructeur sert en gnral dfinir les attributs selon les arguments passs en
paramtres.
Ensuite, nous dfinissons la variable de la classe, $variable1, pour cela on utilise l'objet suivi
d'un tiret - puis d'un signe suprieur > et on ajoute le nom de la variable (qui est l'intrieur
de la classe) sans le signe dollar $.
L'utilisation des fonctions (mthodes) de la classe se fait de la mme manire que les
variables (attributs) comme nous le voyons pour la mthode fonction2().


Partie 2 : Pratique

1. De la Thorie la Pratique
1.1 POO en PHP : Partie 2

Bienvenu(e) dans la deuxime partie de ce tutorial rserv l'tude et l'apprentissage de la
POO (Programmation Oriente Objets) dans le langage PHP. Nous allons tudier plus en
profondeur le fonctionnement des classes.

1.2 Pour la Pratique

Je considrerais comme acquis le premier article du mme sujet (Partie 1 : Introduction)

2. Dans la Classe
2.1 Mots-Cl

Voici un rsum des mots-cls utiliser dans vos classes :
Mots-cl des classes
class
Il sert dfinir une classe, utiliser au dbut, nous reverrons
sont utilisation plus loin.
var Dfini les attributs de la classe.
function
Dfini les mthodes de la classe (mme utilisation que le
mot-cl du mme nom dans le code source PHP)
new
Il permet d'instancer une classe dans un objet, utiliser dans
le code source de votre page PHP.

2.2 Cration d'une classe

Nous allons utiliser le mot cl class pour commencer une nouvelle classe. Le mieux, est de
placer la source de la classe dans un fichier part de la page PHP, afin de pouvoir rutiliser la
classe dans d'autres pages ou applications. Vous n'avez plus qu'ensuite faire un include du
fichier contenant la classe dans toutes vos pages PHP devant l'utiliser.
Moi, j'utilise, pour nommer les fichiers de mes classes l'extension : ".class.php", bien sur vous
pouvez choisir ce qu'il vous plait. Certains utilise ".class" comme extension, c'est une faute
grave car n'importe qui sachant o se trouve le fichier pourra voir le code source de la classe.
Dans la mesure du possible donner vos fichiers une extension fini par ".php"

<?php
/* Fichier classe1.class.php */
// Cration d'une nouvelle classe :
class classe1 // classe1 est le nom de la classe
{
/* Le code de la classe est contenu entre les accolades */
}
?>

2.3 Dfinition d'attributs

Les attributs sont des variables qui sont utiliss dans tous le code de la classe (uniquement),
chaque fonction de la classe peut utiliser un attribut, pour cela, elle utilise une variable
spciale qui fait rfrence l'objet : $this, ainsi pour qu'une mthode puisse profiter d'un
attributs de la classe (p. ex. $variable1) elle utilise $this->variable (p. ex. $this->variable1).
Notez bien que vous devez omettre le signe dollar $ devant le nom de l'attribut de la mme
faon que dans le code source de la page PHP (cf. Partie 1). Pour voir comment une fonction
utilise les attributs, rfrez-vous au 2.4.
Pour dfinir un attribut dans une classe, vous devez utiliser var, suivi du nom de la variable
(attribut) puis d'un point-virgule ; (p. ex. var $variable1; ) Vous pouvez introduire un nombre
infini d'attributs n'importe quel endroit de la classe.
Vous pouvez au moment de dfinir un attribut lui donner une valeur par dfaut, pour cela,
taper var, suivi du nom de la variable (p. ex. $variable2), suivi d'un gal =, puis de la valeur
entre parenthses (p. ex. "Valeur 2"), pour finir ajouter l'habituel point-virgule ; (ce qui donne
p. ex. var $variable2 = "Valeur2";).
Vous avez aussi la possibilit de dfinir un tableau, de la mme faon que ci-dessous, sauf
que la valeur est remplace par array ('valeur1', 'valeur2', 'valeur3') (p. ex. var $variable3 =
array ('Valeur1', 'Valeur2', 'Valeur3');). Voir ci-dessous pour un exemple de tous ce qui t
vu prcdemment.

<?php/
* Fichier classe2.class.php */
// Cration d'une nouvelle classe :
class classe2 // classe2 est le nom de la classe
{
// Attribut sans valeur
var $variable1;
// Attribut avec valeur par dfaut
var $variable2 = "Variable 2";
// Tableau de valeur
var $variable3 = array('Valeur1''Valeur2', 'Valeur3');

?>

2.4 Dfinition de mthodes

Les mthodes sont des fonctions utilises dans la classe, elles ont les mmes spcifications
que les fonctions utilises dans le code source de la page. Ainsi je ne m'tendrais pas
beaucoup dessus, rfrez-vous un cours sur les fonctions utilisateurs, plus complet.
Utilisez le mot-cl function pour introduire une nouvelle fonction au sein de la classe.
Pour savoir comment utiliser les attributs de la classe dans une fonction, voyez l'exemple ci-
dessous. Pour l'utilisation d'autres mthodes de la classe, on procde de la mme faon que
pour les attributs, vous devez utiliser le mot-cl $this faisant rfrence l'objet, suivi de -> et
enfin la fonction, (p. ex. $this->fonction1()). Voyez ci-dessous pour un exemple.

<?php
/* Fichier classe3.class.php */
// Cration d'une nouvelle classe :
class classe3 // classe3 est le nom de la classe
{
// Attribut sans valeur
var $variable1;
// Attribut avec valeur par dfaut
var $variable2 = "Variable 2";
// Tableau de valeur
var $variable3 = array('Valeur1','Valeur2', 'Valeur3');

/* Mthode appelant un attribut de la classe */
function fonction1 ($var)
{
/* Donne une valeur l'attribut $variable1 */:
$this->variable1 = "$var";
}

/* Mthode appelant une autre mthode de la classe */
function fonction2 ()
{
// Appelle la mthode fonction1()
$this->fonction1 ('Variable1');
}
}

?>

2.5 Dfinition du constructeur

Le constructeur est une mthode particulire, elle est lance au moment de l'instanciation de
la classe, elle porte exactement le mme nom que la classe elle-mme.
Le constructeur a gnralement la fonction de donner des valeurs certains attributs selon ce
que le programmeur spcifi lors de la cration (l'instanciation, l'encapsulation) de l'objet (p.
ex. pour une classe grant la date (on peut tout imaginer ;-)) le programmeur va la cration
de l'objet dire qu'il veut la date en franais, le constructeur va par exemple modifier l'attribut
$lang, qui tait par dfaut en EN, il va lui donner la valeur FR.). Voir ci-dessous pour son
utilisation.

3. Dans le code source PHP
3.1 Cration d'un nouvel objet

L'objet est l'utilisateur de la classe, c'est lui qui va profiter des mthodes et attributs de la
classe. Lors de la cration d'un objet (nomm instanciation de la classe) se produit
l'encapsulation, qui cache toute la partie prive de la classe (fonctionnement des mthodes...)
ce qui permet vraiment d'avoir un sentiments de programme part, l'objet est, pour rsumer,
le client de la classe, il lui demande des informations et la classe lui fournit.
Un objet est en fait une variable qui fait rfrence la classe. Comme toute variable, on doit
placer le signe dollar $ devant.
Pour crer un objet (instancer la classe) on utilise le nom de l'objet (p. ex. $mydate, suivi du
mot-cl new, puis de la classe (p. ex. date()). Pour un exemple voyez plus bas.
Attention : Veillez inclure le fichier contenant votre classe avant de crer l'objet.
Post Scriptum : Vous pouvez crer plusieurs objets de la mme classe dans le mme script.

<?php
/* Fichier date.php */
// Inclusion de la classe
include ("date.class.php");

/* Cration d'un objet sans lancement du constructeur */
$mydate = new date();

/* Cration d'un objet avec lancement du constructeur */
$mydate2 = new date ("FR");

/* Une classe peut aussi tre instancer dans une ligne d'un tableau */
$myarray[3] = new date ("FR");
?>
3.2 Appel d'attribut

Une classe ne servirait rien si vous ne pouviez accder aux informations qu'elle contient (via
les attributs). Donc je vais vous expliquer comment y accder et les utiliser.
Pour utiliser un attribut d'une classe, vous devez utiliser l'objet, suivi de -> et du nom de la
variable sans le signe dollar $, cela ne vous rappelle rien ? Mais si ! La variable $this que l'on
utilise pour faire rfrence l'objet l'intrieur de la classe. Et bien en dehors de la classe,
cela se comporte de la mme faon. (p. ex. $mydate->lang, fait rfrence l'attribut $lang de
la classe date vu ci-dessus)

<?php
/* Fichier date.php */
// Inclusion de la classe
include ("date.class.php");

/* Cration d'un objet avec lancement du constructeur */
$mydate = new date ("FR");

// Redfinition de la valeur de l'attribut $lang
$mydate->lang = "EN";

// Affichage de l'attribut $lang
echo "$mydate->lang";
?>

3.3 Appel de mthodes

Pour utiliser les mthodes d'une classe on utilise la mme technique que pour les attributs (cf.
ci-dessus). En effet, l'on procde de cette faon : $class->fonction1 ("valeur1", "valeur2");
<?php
/* Fichier classe3.php */
// Inclusion de la classe
include ("classe3.class.php");

/* Cration d'un objet : Instance de la classe3 (vu dans 2.4)*/
$class = new classe3 ();

// Appel de la mthode fonction1()
$class->fonction1 ("Variable 1");
?>

4. Pour aller plus loin
4.1 L'hritage de classe

C'est dans ce domaine que nous apercevons que la POO en PHP n'est qu'une "copie" de la
vraie Programmation Oriente Objets. En effet, il ne gre que l'hritage de classe simple.
L'hritage de classe est la technique qui permet de crer des extensions de classes, une classe
qui est "fille" d'une autre classe, "hrite" des attributs et mthodes de la classe "mre". C'est l
l'aspect le plus compliqu des objets.
Pour dclarer une extension d'une classe (classe fille), on utilise le mot-cl class, suivi de le
classe fille puis du nouveau mot-cl extends, termin par la classe mre (p. ex. class
classe_fille extends classe_mere).


<?php
/* Fichier extends.class.php */
// Cration d'une classe fille
/* classe_fille est le nom de la classe qui hrite des attributs et
mthodes de classe_mere */
class classe_fille extends classe_mere
{
/* Dfinition des attributs et mthodes de la classe classe_fille.
L'utilisation des attributs et des mthodes de la classe classe_mere se
fait comme-ci ils taient inclus dans classe_fille*/
}
?>

4.2 Dure de vie des Objets

Un des normes avantages des objets, peu connu par les dbutants, est le passage d'un objet
d'une page l'autre. Comment-est-ce possible ? En appelant une fonction qui va linariser
notre objet, de tel faon que l'on puisse le passer en paramtre un URL, dans une variable de
session ou encore par un champs cach dans la page (input hidden).
Cette fonction magique est serialize(), il vous suffit de stocker dans une variable l'objet trait
par serialize(), puis de le "regonfler" grce une autre fonctions connexe, unserialize() (cf. ci-
dessous).

<?php
/* Fichier linear.php */
// Cration d'un nouvel objet (celui linariser)
$objet = new classe();

// Variable qui contient l'objet linariser
$objet_linear = serialize($objet);

/* Nous supposons que la variable t pass une autre page, nous allons
maintenant la dlinariser */

/* On crer la variable "hte" de l'objet (du mme nom que l'objet original
par exemple) */
$objet = unserialize($objet_linear);
/* Et voil ! $objet dispose des mme caractristique qu'au dpart,
(n'oubliez pas d'inclure sur la nouvelle page la classe qui t instanc
par $objet) */
?>

4.3 "Endormir" l'Objet

Lors de la linarisation de l'objet par la fonction serialize() (cf. ci-dessus), les connections aux
bases de donnes, fichiers ouverts, sockets...etc. ne sont pas referms, ce qui peut causer de
graves ennuis. C'est pourquoi la fonction __sleep() t dfinie. Vous devez, si votre objet est
destin tre linariser, crer une nouvelle mthode dans votre classe portant le nom :
__sleep(), elle aura pour fonction de fermer toutes les connections. Au moment de l'appel de
la fonction serialize(), la mthode __sleep() sera automatiquement lance.
Par opposition, la mthode __wakeup(), sera automatiquement lance, si elle existe, lors de
l'appel la fonction unserialize(). Elle servira relancer les diverses connections closent aprs
l'appel de la mthode __sleep().


<?php
/* Fichier sleep.class.php */
// Cration d'une nouvelle classe
class endormir
{
// Dfinition de la mthode __sleep()
function __sleep()
{
// Fermeture des connections
}

// Dfinition de la mthode __wakeup()
function __wakeup()
{
// Rouverture des connections
}
}
?>


Partie 3 : Exemples

1 I ntroduction

Dans l'article prcdent nous avons vu la cration et l'utilisation des classes en PHP, dans le
prsent article, nous allons tudier des exemples concrets et comments afin de mieux
comprendre le fonctionnement des objets et classes, ainsi nous carterons les ventuelles
lacunes ou questions que vous vous posiez.

2. Classe 1 : SGBD
2.1 Connexion une base de donnes

Sur cet exemple, nous allons partir d'une premire classe (la classe mre) obtenir des
informations, telles que le login, password, hte et nom de la base de donnes. Ensuite, nous
allons utiliser une classe diffrente qui sera une expansion de la classe mre (une classe fille),
elle aura pour utilit d'effectuer des requtes, de se connecter/dconnecter la base de
donnes. Elle sera spcifique une base de donnes (MySQL) mais puisqu'elle est une
expansion de la classe mre, nous pourrons crer dautres classes filles pour des SGBD
(Serveur de Gestion de Base de Donnes) diffrents.

Tableau des diffrentes classes, attributs et mthodes
class SGBD Nom de la classe mre
class MySQL Nom de la classe fille, destine pour le SGBD MySQL.
var $SGBD_login Attribut contenant le login de la base de donne
var $SGBD_password Attribut contenant le password de la base de donne
var $SGBD_host Attribut contenant l'hte de la base de donne
var $SGBD_base Attribut contenant le nom de la base de donne
function connect() Mthode de connection au SGBD
function requete() Mthode d'envoi de requte au SGBD
function deconnect() Mthode de dconnection au SGBD
var $connect Attribut contenant la connection au SGBD

Nous pouvons maintenant construire notre classe mre (SGBD) !

<?php
/* Fichier : SGBD.class.php */
// Cration de la classe mre
class SGBD
{
// Attribut du login du SGBD
var $SGBD_login;
// Attribut du password du SGBD
var $SGBD_password;
// Attribut de l'hte du SGBD
var $SGBD_host;
// Attribut du nom de la base de donnes
var $SGBD_base;
// Attribut de connection
var $connect;
// Attribut de requte
var $requete;

// Dfinition du constructeur
function SGBD ($login, $password, $host, $base)
{
// Vrification des variables
if (empty ($login) || empty ($host) || empty ($base))
{
// Affichage du message d'erreur
echo "<b>Erreur :</b> Une ou plusieurs variable(s) n'ont pas
t renseign.";
exit;
}
else
{
// Initialisation des attributs
$this->SGBD_login = $login;
$this->SGBD_password = $password;
$this->SGBD_host = $host;
$this->SGBD_base = $base;
}
}
}
?>

Voyons maintenant la cration d'une mthode pour se connecter, avec les informations vu ci-
dessus, une base de donnes MySQL

function connect()
{
// Connection MySQL
$connect = mysql_pconnect($this->SGBD_host, $this->SGBD_login, $this-
>SGBD_password);

// Vrification de la connection
if(!$connect)
{
// Affichage du message d'erreur
echo "<b>Erreur :</b> Connection MySQL impossible.";
exit;
}

// Connection la base de donnes
if (!mysql_select_db($this->SGBD_base, $connect))
{
// Affichage du message d'erreur
echo "<b>Erreur :</b> Connection la base de donnes impossible.";
exit;
}

// Initialisation de l'attribut de connection
$this->connect = $connect;
}
Aprs la connection, il faut envoyer des requtes au SGBD, pour cela, nous allons
programmer une petite mthode : requete().
Remarque : Cet article est consacr l'apprentissage de la Programmation Objets en PHP. En
consquence je ne ferais pas de rappel sur l'utilisation du langage SQL.

function requete ($requete)
{
// Excution de la requte
$result = mysql_query($requete, $this->connect);

// Vrification de la requte
if (!$result)
{
// Affichage du message d'erreur
echo "<b>Erreur :</b> Impossible d'effectuer la requte au
serveur.";
exit;
}
else
{
// Initialisation de l'attribut de requte
$this->requete = $result;
}
}

Ultime et dernire mthode : deconnect(). Comme vous l'avez srement devin, cette fonction
sert se dconnecter de la base de donnes.

function deconnect()
{
// Dconnection de la base de donnes
mysql_close($this->connect);
}

Voil ! Nous avons finis de programmer toutes les mthodes de l'expansion de classe
MySQL. Il reste une dernire chose faire, trs importante. La cration de la classe fille
MySQL.

<?php
/* Fichier : MySQL.SGBD.class.php */
// Cration de la classe fille
class MySQL extends SGBD
{
// Mthode connect()
function connect()
{
// Connection MySQL
$connect = mysql_pconnect ($this->SGBD_host, $this->SGBD_login,
$this->SGBD_password);

// Vrification de la connection
if(!$connect)
{
// Affichage du message d'erreur
echo "<b>Erreur :</b> Connection MySQL impossible.";
exit;
}

// Connection la base de donnes
if(!mysql_select_db($this->SGBD_base, $connect))
{
// Affichage du message d'erreur
echo "<b>Erreur :</b> Connection la base de donnes
impossible.";
exit;
}

// Initialisation de l'attribut de connection
$this->connect = $connect;
}

// Mthode requete()
function requete ($requete)
{
// Excution de la requte
$result = mysql_query($requete, $this->connect);

// Vrification de la requte
if(!$result)
{
// Affichage du message d'erreur
echo "<b>Erreur :</b> Impossible d'effectuer la requte au
serveur.";
exit;
}
else
{
// Initialisation de l'attribut de requte
$this->requete = $result;
}
}

// Mthode deconnect()
function deconnect()
{
// Dconnection de la base de donnes
mysql_close($this->connect);
}
}
?>

Nous avons maintenant terminer notre classe, dans le paragraphe suivant, nous allons voir
comment l'utiliser.

2.2 Utilisation de la Classe

Rsumons la situation, nous avons une classe (mre) : SGBD, qui obtient les informations
pour se connecter un SGBD. Ensuite, nous avons une deuxime classe (fille) : MySQL, qui
permet de se connecter, d'effectuer des requtes et de se dconnecter la base de donne
MySQL, cette classe peut tre dupliquer et "traduite" pour d'autres SGBD.
Dans le fichier ci-dessous, nous allons mettre l'oeuvre nos deux classes parentes (Aucun
rappel sur le SQL ne sera fait).
<?php
/* Fichier : SGBD.php */
// Inclusion de la classe mre
include ("SGBD.class.php");

/* Initialisation de la variable du SGBD correspondant */
$SQL = "MySQL";

// Inclusion de la classe fille du SGBD correspondant
include ($SQL.".SGBD.class.php");

/* Cration d'un nouvel objet de la classe fille + lancement du
constructeur */
/* Les informations sont adapts mon serveur, vous de les modifier pour
quelles correspondent avec votre SGBD */
$database = new $SQL('root', '', 'localhost', 'test');

// Connection la base de donnes
$database->connect();

/* Excution d'une requte (cration d'une nouvelle base de donnes).
Attention, pour crer une nouvelle base de donnes, il faut que votre
utilisateur ai touts les droits. Ceci n'est qu'un exemple parmi tant
d'autres, vous pouvez effectuer n'importe quel requte MySQL avec cette
mthode */
$database->requete("CREATE DATABASE newBase");

// Dconnection de la base de donnes
$database->deconnect();
?>

2.3 Synthse

Au cours de la ralisation de cette classe, je me suis rendu compte qu'il tait beaucoup plus
facile de crer une base de donnes via ce script , que en utilisant PHPMyAdmin ou encore
eSKUel. Notre classe est maintenant finis, je vous invite l'amliorer (c'est facile), vous
pouvez par exemple postez dans les commentaires des classes filles de votre cration
s'adaptant d'autre SGBD. Vous pouvez aussi amliorer la mthode requete(), tout est
possible !

3. Classe 2 : email
3.1 Envois d'emails

Dans cet exemple, nous allons raliser une classe d'envois d'emails. Cela existe dj ? Oui, la
fonction mail() permet en effet de procder l'envois d'emails; mais elle ne gre pas les
erreurs, et l'utilisation du HMTL est laborieux pour un dbutant. Nous allons en raliser une
plus simple mais plus puissante (seulement en fonctionnalit, car au sein de notre classe, nous
utiliserons la fonction mail()).
Attention : Votre hbergeur doit accepter la fonction mail().
Notre classe va tout d'abord, lors de son instanciation, rcuprer les informations concernant
l'expditeur et le destinataire, il sera possible de rinitialiser le destinataire en cours
d'utilisation ou d'en dfinir plusieurs.

Tableau des diffrents attributs, mthodes et la classe
class email Nom de la classe.
function email Constructeur, il dfini le destinataire
function add() Mthode d'ajout de destinataire
function send() Mthode d'envoi de l'email
function reset() Mthode de rinitialisation des attributs
var $dest Attribut contenant le(s) destinataire(s)
var $from Attribut contenant l'expditeur
Passons la programmation du constructeur de la classe. Portant le mme nom que la classe
bien sr.

function email ($from, $dest)
{
// Vrification des variables
if (!empty ($dest) && !empty ($from))
{
// Initialisation des attributs
$this->dest = $dest;
$this->from = $from;
}

else
{
// Affichage du message d'erreur
echo "<b>Erreur :</b> Le destinataire ou/et l'expditeur n'ont pas
t dfinis.";
exit;
}
}

Maintenant, nous allons raliser la mthode la plus simple, reset(). Elle va tout simplement
remettre zro les attributs et les redfinir, en fait, elle est exactement identique au
constructeur.

function reset ($from, $dest)
{
// Vrification des variables
if (!empty ($dest) && !empty ($from))
{
// Initialisation des attributs
$this->dest = $dest;
$this->from = $from;
}
else
{
// Affichage du message d'erreur
echo "<b>Erreur :</b> Le destinataire ou/et l'expditeur n'ont pas
t dfinis.";
exit;
}
}

Prochaine mthode : add(), elle permet d'ajouter un nouveau destinataire, ou de rinitialiser
l'attribut $dest.
function add ($dest, $reset = '0')
{
// Vrification de la variable $dest
if (!empty ($dest))
{
// Vrification de la variable $reset
if (!$reset)
{
// Initialisation du destinataire
$this->dest = $dest;
}
else
{
// Ajout d'un nouveau destinataire
$this->dest .= "; $dest";
}
}
else
{
// Affichage du message d'erreur
echo "<b>Erreur :</b> Aucun nouveau destinataire dfini.";
}
}

Ensuite, nous allons coder la mthode la plus importante : send(), c'est elle qui va envoyer
l'email, plusieurs paramtres vont tre saisir, notamment $HTML qui va spcifier si l'envoi
devra se faire au format HTML.
function send ($sujet, $message, $HTML = '0')
{
// Vrification des variables
if (!empty($sujet) && !empty($message))
{
// Vrification de la variable $HTML
if (!$HTML)
{
// Initialisation de la variable $from
$from = "From: ".$this->from."\r\n";
}
else
{
// Initialisation de la variable $from
$from = "From: ".$this->from."\r\n";
$from .= "Content-Type: text/html; charset=us-ascii\r\n";
}
// Envoie de l'email
@mail ($this->dest, $sujet, $message, $from) or die ("<b>Erreur
:</b> Impossible d'envoyer l'email.");
}
else
{
// Affichage du message d'erreur
echo "<b>Erreur :</b> Le sujet ou/et le message n'ont pas t
dfinis.";
exit;
}
}

Assemblons maintenant toutes nos mthodes au sein de la classe email.

<?php
/* Fichier : email.class.php */
// Cration d'une nouvelle classe
class email
{
// Attribut $dest
var $dest;
// Attribut $from
var $from;

// Constructeur de la classe : email()
function email ($from, $dest)
{
// Vrification des variables
if (!empty ($dest) && !empty ($from))
{
// Initialisation des attributs
$this->dest = $dest;
$this->from = $from;
}
else
{
// Affichage du message d'erreur
echo "<b>Erreur :</b> Le destinataire ou/et l'expditeur n'ont
pas t dfinis.";
exit;
}
}

// Mthode de rinitialisation : reset()
function reset ($from, $dest)
{
// Vrification des variables
if (!empty ($dest) && !empty ($from))
{
// Initialisation des attributs
$this->dest = $dest;
$this->from = $from;
}
else
{
// Affichage du message d'erreur
echo "<b>Erreur :</b> Le destinataire ou/et l'expditeur n'ont
pas t dfinis.";
exit;
}
}

// Mthode j'ajout de destinataire : add()
function add ($dest, $reset = '0')
{
// Vrification de la variable $dest
if (!empty ($dest))
{
// Vrification de la variable $reset
if ($reset)
{
// Initialisation du destinataire
$this->dest = $dest;
}
else
{
// Ajout d'un nouveau destinataire
$this->dest .= ",$dest";
}
}
else
{
// Affichage du message d'erreur
echo "<b>Erreur :</b> Aucun nouveau destinataire dfini.";
}
}

// Mthode d'envoie d'email

function send ($sujet, $message, $HTML = '0')
{
// Vrification des variables
if (!empty ($sujet) && !empty ($message))
{
// Vrification de la variable $HTML
if (!$HTML)
{
// Initialisation de la variable $from
$from = "From: ".$this->from."\r\n";
}
else
{
// Initialisation de la variable $from
$from = "From: ".$this->from."\r\n";
$from .= "Content-Type: text/html; charset=us-ascii\r\n";
}
// Envoie de l'email
@mail ($this->dest, $sujet, $message, $from) or die ("<b>Erreur
:</b> Impossible d'envoyer l'email.");
}
else
{
// Affichage du message d'erreur
echo "<b>Erreur :</b> Le sujet ou/et le message n'ont pas t
dfinis.";
exit;
}
}
}
?>

Voil, vous disposez maintenant d'une classe facilitant l'envoie de mail HTML et texte.
Voyons maintenant son utilisation.
3.2 Utilisation de la classe
Rsumons le fonctionnement de cette classe, lors de l'instanciation, le constructeur dfini un
expditeur et un destinataire, la mthode reset(), quivalente, peut tre utiliser n'importe
quel endroit du script. La mthode add() permet de rinitialiser le destinataire ou d'en ajouter
de nouveaux. Quant la mthode send(), elle envoie un email avec les informations donnes,
elle prend en paramtre la possibilit d'utilisation du HTML.

<?php
/* Fichier : email.php */
// Inclusion de la classe email
include ("email.class.php");

/* Cration d'un nouvel objet de la classe email + lancement du
constructeur */
$email = new email ('expeditaire@mail.org', 'destinataire@mail.org');

// Rinitialisation des informations
$email->reset ('bloodshed@xosc.org', 'article@moteurprog.com');

// Rinitialisation du destinataire
$email->add ('webmaster@moteurprog.com', '1');

// Ajout d'un nouveau destinataire
$email->add ('article@moteurprog.com');

// Envoie de l'email au format texte
$email->send ('sujet', 'Voici le message');

// Envoie de l'email au format HTML
$email->send ('sujet', 'Voici le <b>message</b>', '1');
?>

3.3 Synthse

A vous maintenant d'amliorer cette classe ! Vous pouvez par exemple la modifier pour qu'il
corresponde un script de newsletter.


Partie 4 : Librairie

1. Librairie
1.1 Librairie ou bibliothque ?

L'appellation de librairie vient d'un import abusif du mot "library" en anglais. C'est un
synonyme de bibliothque. Une librairie est un ensemble de mthodes, d'attributs et de classes
runis dans un fichier directement utilisable l'intrieur d'une application. Il y a diffrents
types de librairies, le PHP utilise les bibliothques statiques, qui sont systmatiquement
recopies au sein du code source.

1.2 Au projet ?

Dans cet article nous allons dvelopper une petite bibliothque de moteur de modle
(templates). Pourquoi ? Parce que je n'ai remarqu aucun article francophone permettant
d'expliquer la cration d'une classe de gnration de gabarit HTML et aussi car pendant les
vacances (fvrier 2004), j'en ai ralis une pour comprendre le principe et pour l'utiliser dans
mes propres programmes. Ainsi, voici le premier article franais consacr la ralisation d'un
mini moteur de template en PHP (le 20/02/2004), et si vous n'tes pas d'accord, veuillez me le
signaler.
Les templates, un nouveau phnomne actuel dans la programmation en PHP. Je ne ferais
aucune explication quant au fonctionnement des templates et leur but, je vous conseillerais
avant de lire ce tutorial un trs bon article sur les modles (template en anglais) : Les systmes
de templates de Bobe.

2. Conception
2.1 Elaboration du plan

Il faut avant tout dfinir un "plan" de tous les membres de notre classe.
Tableau des membres de la classe
class template Nom de la classe.
var $fields Tableau des variables du template.
var $content Contenu du template .
function template() Constructeur, charge le template.
function assign()
Mthode qui permet de donner une valeur aux variables
du template.
function parse() Remplace les variables par leur valeur.
function display() Envoie le rsultat au navigateur.

La gnration de gabarit (template) en PHP est plutt rserv aux niveaux intermdiaires, et
puisque nous sommes dans un article rservs aux dbutants qui cherchent apprendre la
POO (Programmation Oriente Objets) en PHP, j'ai voulu simplifier au maximum la classe.
En effet celle-ci ne grera pas les blocs, ni les boucles et ni la gestion de plusieurs templates.
Cependant, pour ceux qui auraient envies de continuer cette mini-classe, je les invite me
contacter pour rcuprer conseils ou algorithmes permettant de rendre cette classe aussi
efficaces sur des petits projets qu'un vrai moteur de modles.

3. Conception
3.1 La classe !

Commenons par dfinir les attributs de la classe. Le premier : $fields, va contenir un tableau
avec comme cl le nom de la variable du template et comme valeur, la valeur (logique?) de la
variable. Le suivant et dernier (je vous avez dit qu'elle tait simple !) attribut : $content, va,
comme son nom l'indique garder en mmoire le contenu du template.
Voici la source qui dfinit nos deux attributs :
// Attribut des variables du template
var $fields = array();
// Attribut du contenu du template
var $content;
Aprs nos attributs, nous allons nous attaquer au constructeur : template(), son but va tre de
rcolt le chemin d'accs au modle et de rcuprer son contenu dans l'attribut $content.
// Initialisation du constructeur template()
function template ($chemin)
{
// Ouverture du modle
$modele = @fopen ($chemin, 'r');
// Dfinition de l'attribut $content
$this->content = @fread ($modele, @filesize ($chemin));
// Fermeture du modle
@fclose ($modele);
}
Aprs avoir dfini un modle, il faut attribuer des valeurs ses variables; ce sera le rle de la
mthode assign().
// Initialisation de la mthode assign()
function assign ($field, $value)
{
// Ajout d'une ligne dans le tableau $fields
$this->fields[$field] = $value;
}
Troisime mthode : parse(), elle sera charg de remplacer les variables du template par leur
valeur via le tableau $fields.
// Initialisation de la mthode parse()
function parse()
{
// Parcours du tableau $fields
foreach ($this->fields as $key => $value)
{
// Remplacement des valeurs dans le modle
$result = ereg_replace ("{".$key."}", $value, $this->content);
// Initialisation du contenu du template
$this->content = $result;
}
}
Dernire mthode, la plus importante, celle qui va afficher le rsultat de notre fusion l'cran
: display(). Sa fonction est trs simple, elle prend le contenu de l'attribut contenant le template
($content) puis l'affiche.
// Initialisation de la mthode display()
function display()
{
// Affichage du template
echo $this->content;
}
<?php
/* Fichier : template.class.php */
// Cration de la classe
class template
{
// Initialisation du constructeur template()
function template ($chemin)
{
// Ouverture du modle
$modele = @fopen ($chemin, 'r');
// Dfinition de l'attribut $content
$this->content = @fread ($modele, @filesize ($chemin));
// Fermeture du modle
@fclose ($modele);
}

// Initialisation de la mthode assign()
function assign ($field, $value)
{
// Ajout d'une ligne dans le tableau $fields
$this->fields[$field] = $value;
}

// Initialisation de la mthode parse()
function parse()
{
// Parcours du tableau $fields
foreach ($this->fields as $key => $value)
{
// Remplacement des valeurs dans le modle
$result = ereg_replace ("{".$key."}", $value, $this->content);
// Initialisation du contenu du template
$this->content = $result;
}
}

// Initialisation de la mthode display()
function display()
{
// Affichage du template
echo $this->content;
}
} ?>

4. Utilisation
4.1 Template

Pour utiliser notre classe, il nous faut plusieurs fichiers, un gabarit HTML (template.html), un
utilisateur de la classe (template.php) et la classe elle-mme (template.class.php).
Un gabarit HTML ou modle (template) est tout simplement un fichier HTML normal sauf
que les endroits ou le contenu est gnr dynamiquement, il y a une variable de template, elle
ressemble ceci dans notre cas {VARIABLE}.
<!-- Fichier : template.html -->
<html>
<head>
<title>{TITRE}</title>
</head>

<body>
{TEXTE}
</body>
</html>
Ceci est un exemple trs simple, seulement pour montrer le fonctionnement de la classe.
L'utilisateur de la classe, il va dfinir les valeurs des variables du gabarit, puis les afficher.
<?php
/* Fichier : template.php */

// Inclusion de la classe de template
require ("template.class.php");

// Cration d'une nouvelle instance de la classe et dfinition d'un gabarit
$tpl = new template ("template.html");

// Initialisation des variables du gabarit
$tpl->assign ("TITRE", "Test de notre classe.");
$tpl->assign ("TEXTE", "Voici un test mettant l'preuve notre classe de
template");

// Analyse du template
$tpl->parse();

// Affichage du rsultat
$tpl->display();
?>

5. Conclusion
5.1 Notre classe

Vous pouvez amliorer cette classe en implmentant la gestion des blocs ou encore de
plusieurs gabarits en mme temps, n'oubliez pas non plus la possibilit de "parser" plusieurs
fois les blocs. Pour les plus dbutants d'entre vous, vous pouvez programmez la gestion des
erreurs.

5.2 Systmes alternatifs

Beaucoup de solutions de template existe l'heure actuelle (Smarty, Templeet, Modelixe...)
mais la plupart son beaucoup trop lourde (malgr un systme de cache) pour des petit projet
(un livre d'or...) dans ce cas, la cration de son propre systme de template est une bonne
solution pour rivaliser de performances.


Partie 5 : Annexe

1. Finis ?

Bienvenu(e) dans le dernier petit article sur la Programmation Oriente Objets en PHP; celui-
ci sera un annexe vous permettant de continuer votre apprentissage de la POO. Vous
trouverez des liens vers d'autres articles, tutoriaux, rfrences et scripts.

2. Liens
2.1 Articles

http://www.phpteam.net/affiche.php?quoi=php5new4
Explications allchantes des changements dans la POO pour PHP 5.
http://www.phpinfo.net/articles/article_classes.html
Article trs complet et intressant sur la Programmation Oriente Objets en PHP.
http://www.phpdebutant.org/article44.php
Tout sur la srialisation d'objets en PHP.
http://www.phpdebutant.org/article43.php
Hritage de classe dans ses moindres recoins.
http://www.phpdebutant.org/article42.php
Approche pour les dbutant la Programmation Oriente Objets en PHP.
2.2 Tutoriaux
http://hachesse.developpez.com/objetphp/
Un tutorial des plus complets !
http://www.puread.net/technologie_la_programmation_orientee_objet_poo_article7.html
Approche plutt complte de la POO en PHP.
2.3 Scripts
http://php-directory.org/directory/data,Scripts,Librairie.html
Beaucoup de librairies intressantes.
http://www.nexen.net/scripts/
Collection impressionnante de scripts et librairies intressantes et peu courantes.

3. Finis !
3.1 A suivre

Aprs avoir finis cet article. J'ai construit un petit fichier compress contenant les cinq articles
et les sources des trois classes vu travers notre apprentissage de la POO en PHP. Ce fichier
est tlchargeable dans la rubrique tutorial PHP de MoteurProg.com.
Cette petite liste de liens est loin d'tre exhaustive. En effet j'avoue ne pas possder un
bookmark trs complet sur la POO en PHP. Ainsi je fais appelle vous pour la complter
dans les commentaires !
3.2 L'auteur
Je suis loin d'tre un professionnel en la matire mais j'essaie de vous apporter le (peu?) de
connaissances que je possde, merci de votre comprhension (surtout que c'est mon premier
article), pour les fautes, erreurs ou suggestion contactez-moi. Je m'efforce de relire et faire
relire mes articles, excusez-moi la rencontre d'une erreur.

Vous aimerez peut-être aussi