La programmation objet (première approche)

Apres avoir vu les concepts fondamentaux de la programmation objet, attardons nous sur la programmation objet vu du côté de PHP.

Pour cela, je vous propose de réaliser notre premier classe : une classe qui vous servira à envoyer des mails.

Jusqu'à présent, pour envoyer des mails, vous deviez recopier toujours le même code avec des en-têtes à n'en plus finir.
Tout ceci sera fini avec votre classe d'envois de mails : vous écrirez une fois pour toute votre code, et ensuite, vous réutiliserez ce même code à chaque fois que vous aurez l'envie envoyer des mails.

Afin de commencer sur de bonnes bases, je vous conseille de stocker votre classe de mails dans un fichier PHP, comme par exemple sendmail.class.php, puis d'include ce fichier dans vos scripts lorsque vous en aurez besoin.

Attaquons tout de suite le code de notre classe !

Voici les premières lignes de code de notre classe :

exemple1.php
<?php
class SendMail {
var $destinataire;
var $objet;
var $texte;
}
?>


Comme vous le voyez, la déclaration d'une classe en PHP démarre par le mot clé class suivi du nom de la classe. Nous ouvrons alors une accolade ouvrante qui délimite le début de la déclaration des méthodes et des attributs de la classe (la déclaration de la classe se terminant avec une accolade fermante).

Ensuite, nous joignons 3 variables à notre classe : $destinataire, $objet et $texte.
Ces 3 variables sont en fait les caractéristiques communes des objets (les attributs) que nous allons pouvoir créer grâce à notre classe.
Noter que l'on déclare ces attributs avec le mot réservé var.

En clair, cela veut dire que tous les objets que nous allons créer avec cette classe (des mails en l'occurrence) auront toujours un destinataire, un objet et un texte.

Vous pouvez déclarer autant d'attributs de classe que vous le souhaitez.

Premier exemple d'utilisation :

exemple2.php
<?php
// on inclut le code de notre classe
include ("./sendmail.class.php");

// on déclare notre objet (en fait, dans le langage objet, on dit que l'on crée une instance de la classe SendMail)
$message = new SendMail ();

// on affecte des valeurs aux attributs de notre objet
$message->destinataire = "toto@toto.com";
$message->objet = "Scoop mondial !";
$message->texte = "Voici mon premier mail utilisant une classe mail :)";
?>


Noter l'utilisation de l'opérateur -> qui permet d'affecter des valeurs aux attributs de notre objet.
Nous verrons par la suite que cet opérateur nous permet également d'appliquer les méthodes de la classe sur notre objet.

Vous vous doutez bien qu'à ce niveau là, aucun mail n'a été envoyé :)
Cependant, vous pouvez vérifier que notre objet possède bien les attributs que nous lui avons fourni en faisant des :

exemple3.php
<?php
echo $message->destinataire; // retournera : toto@toto.com
echo $message->objet; // retournera : Scoop mondial !
echo $message->texte; // retournera : mon premier mail utilisant une classe mail :)
?>


Pour envoyer notre mail, nous allons écrire une méthode pour notre classe qui utilisera la fonction mail de PHP ainsi que les attributs de notre objet.

On aura alors (pour notre classe) :

exemple4.php
<?php
class SendMail {
var $destinataire;
var $objet;
var $texte;

function envoyer() {
mail ($this->destinataire, $this->objet, $this->texte);
}
}
?>


Détaillons la méthode envoyer().

Notre méthode utilise la fonction de mail de PHP, et elle prend en argument les valeurs des attributs de notre classe.
Cependant, remarquez l'utilisation de $this.
$this indique l'instance courante de notre classe.
Cet objet représente donc notre objet $message que nous utilisons dans notre script.



Vous pouvez écrire autant de méthodes que vous le souhaitez pour votre classe.

Cependant, sachez que vous ne pouvez écrire qu'une seule méthode ayant le même nom que le nom de votre classe (il s'agit en fait du constructeur de la classe qui a un rôle particulier au sein de la classe, nous le détaillerons plus tard).

Envoyons maintenant notre mail grâce à notre méthode envoyer() :

exemple5.php
<?php
include ("./sendmail.class.php");

$message = new SendMail ();

$message->destinataire = "toto@toto.com";
$message->objet = "Scoop mondial !";
$message->texte = "Voici mon premier mail utilisant une classe mail :)";

// on applique la méthode envoyer() à notre objet $message grâce à l'opérateur ->
$message->envoyer();
?>


Plutôt pratique non ? :)
En effet, la programmation par objet a cet avantage indéniable, c'est que vous n'étés pas obliger de comprendre comment fonctionne une classe. Du moment que vous savez à quoi servent vos méthodes (leur rôle), vous pouvez les utiliser sans comprendre ce qu'il se passe derrière (le code de la classe en elle-même).

Mais vous pouvez aussi réutilisez vos classes dans d'autres scripts (ce qui reste l'avantage principal de cette forme de programmation).

Voyons maintenant le constructeur d'une classe.

En effet, toute classe contient une méthode dite "constructeur" et cette méthode a toujours le même nom que le nom de la classe en question.

Sans le savoir, lorsque vous avez écrit le code :

exemple6.php
<?php
message = new SendMail ();
?>


Et bien vous avez appelé le constructeur par défaut de la classe SendMail.

Cependant, comme vous l'avez remarqué, notre classe SendMail ne comporte pas de méthode SendMail() (le constructeur d'une classe est la méthode de cette classe qui porte le même nom que le nom de la classe), et bien dans ce cas, PHP utilise un constructeur par défaut qui n'affecte en rien sur les propriétés de notre objet.

Toutefois, vous pouvez vous-même écrire un constructeur dans votre classe.

Mais il faut savoir que le code que vous allez mettre dans votre constructeur va se répercuter sur tous les objets qui seront instances de votre classe.

Prenons un exemple simple :

Imaginer que vous ayez une classe Bonhomme.
Un des attributs de cette classe serait $nom, représentant le nom de notre bonhomme.
Si vous instancier votre classe simplement (en faisant donc un new Bonhomme() tout simple) alors que vous n'avez pas spécifié de constructeur, PHP va vous créer un Bonhomme sans nom (l'attribut $nom de notre objet sera vide).
Cependant, vous pouvez très bien écrire vous-même votre propre constructeur pour donner un nom à votre Bonhomme dès sa création.

Revenons alors à notre classe SendMail, et nous allons lui spécifier un constructeur qui va permettre de définir si le mail à envoyé sera au format texte ou html.

On aura alors :

exemple7.php
<?php
class SendMail {
var $destinataire;
var $objet;
var $texte;

// on ajoute un attribut $entete à notre classe
var $entete;

// le constructeur de notre classe qui prend un paramètre
function SendMail ($type = "texte") {
if ($type == "texte") {
$this->entete = "Content-type: text/plain; charset=iso-8859-1n";
}
elseif ($type == "html") {
$this->entete = "Content-type: text/html; charset=iso-8859-1n";
}
}

function envoyer() {
mail ($this->destinataire, $this->objet, $this->texte, $this->entete);
}
}
?>


Vous remarquerez alors que grâce à notre constructeur, nous allons pouvoir rapidement créer des mails au format texte ou bien au format html.

Exemple :

exemple8.php
<?php
include ("./sendmail.class.php");

// $message sera un mail au format texte
$message = new SendMail ();

// $message2 sera un mail au format texte
$message2 = new SendMail ("texte");

// $message3 sera un mail au format html
$message3 = new SendMail ("html");
?>


En résumé, le constructeur de la classe sert souvent à initialiser certains attributs des objets crées à partir de la classe.

Attention, une classe ne peut contenir qu'un seul constructeur.

Ce cours vous a donc présenté quelques rudiments de la programmation par objet en PHP, cependant, vous avez du remarquez que contrairement au premier cours (les concepts fondamentaux), de nombreux concepts n'ont pas étés traités ici.

Ces concepts seront traités dans un futur cours afin de ne pas trop vous embrouillez les idées : trop de notions nouvelles d'un coup peut nuire à la compréhension de cette forme de programmation déjà bien complexe.
LoadingChargement en cours