MacNOMODO
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
MacNOMODO

Où on cause du Mac - A consommer sans modération

 
PortailPortailAccueilRechercherRechercherS'enregistrerConnexionDernières images
-29%
Le deal à ne pas rater :
PC portable – MEDION 15,6″ FHD Intel i7 – 16 Go / 512Go (CDAV : ...
499.99 € 699.99 €
Voir le deal

 

 Leçon de PHP n°2.1 : La rentrée

Aller en bas 
AuteurMessage
neiluj
Parasite
Parasite
neiluj


Nombre de messages : 309
Age : 42
Planète : Neptune
Matos : MacBook Air, MacBook Pro Unibody, iMac Alu, MacBook Black, Sanyo Z5
Date d'inscription : 18/09/2007

Leçon de PHP n°2.1 : La rentrée Empty
MessageSujet: Leçon de PHP n°2.1 : La rentrée   Leçon de PHP n°2.1 : La rentrée Icon_minitime2/25/2009, 23:50

Salut à tous,

Je vous prépare un bon gros sujet pour la leçon n°3, mais comme le temps me manque cruellement en ce moment et que je veux bien faire, il va falloir patienter un petit peu ;-)

Sachant que ce cours portera sur les bases de données, enfin … surtout MySQL, qu'il sera plutôt costaud et qu'on continuera à parler "objet", je me suis dit que ce serait pas mal de faire des petites piqûres de rappel avant, sous forme de mini-leçons. Plutôt que des vraies leçons, je vais en fait partager avec vous des astuces et des méthodes plutôt pratiques.
Revenir en haut Aller en bas
neiluj
Parasite
Parasite
neiluj


Nombre de messages : 309
Age : 42
Planète : Neptune
Matos : MacBook Air, MacBook Pro Unibody, iMac Alu, MacBook Black, Sanyo Z5
Date d'inscription : 18/09/2007

Leçon de PHP n°2.1 : La rentrée Empty
MessageSujet: Re: Leçon de PHP n°2.1 : La rentrée   Leçon de PHP n°2.1 : La rentrée Icon_minitime2/26/2009, 00:16

Des méthodes à la chaîne

Si vous êtes déjà développeur, quelque soit le language, peut-être connaissez-vous le chaînage de méthode et dans ce cas vous pouvez passer votre chemin (sauf si vous ne l'avez jamais utilisé avec PHP), dans le cas contraire cela pourrait vous intéresser. Cette méthode apporte surtout un gain dans l'écriture du code et dans sa lisibilité et c'est précieux la lisibilité... Elle peut éventuellement apporter dans la conception, mais couplée à d'autres méthodes que nous verrons plus tard.

Prenons un exemple, j'ai une classe "MaClasse" qui sait faire plusieurs choses. J'ai volontairement utilisé des méthodes qui ne font pas plein de choses à la fois et qui utilise des fonctions simples de php :
Code:

<?php
class MaClasse
{
   public $contenu;
   public function __construct($contenu)
   {
      $this->contenu = $contenu;
   }
   public function nettoie()
   {
      // On enlève des espaces inutiles aux extrémités
      $this->contenu = trim($this->contenu);
   }
   public function embellis()
   {
      // On ajoute une majuscule sur la première lettre
      $this->contenu = ucfirst($this->contenu);
   }
   public function protege()
   {
      // On enlève toutes les balises <script> et leur contenu grâce aux expressions régulières
      $this->contenu = preg_replace('@<script[^>]*?>.*?</script>@si','',$this->contenu);
      // On enlève toutes les balises autres que <b> <i> <u>
      $this->contenu = strip_tags($this->contenu,'<b><i><u>');
   }
   public function espace()
   {
      // On ajoute des balises <br/> dans les sauts de lignes
      $this->contenu = nl2br($this->contenu);
   }
   public function encadre()
   {
      // On ajoute un joli cadre (bien entendu, je vous recommande class et non style...)
      $this->contenu = '<div style="border: 1px solid #DDDDDD; padding: 4px;">'.$this->contenu.'</div>';
   }
   public function affiche()
   {
      echo $this->contenu;
   }
}

Vous voyez, rien de bien méchant, chaque méthode va transformer la propriété contenu de la classe à sa manière.
Et maintenant je veux l'utiliser avec un bout de texte tout bête :

Code:

$texte = 'voici donc un <b>texte</b> tout bête.
avec une ligne en plus et une balise comme <i>ceci</i>
et puis une autre avec une balise comme <u>cela</u>.
<script type="text/javascript">
alert(\'AH! AH! AH! AH! Je suis un vilain à coeur !\');
</script>';

$monObjet = new MaClasse($texte);
$monObjet->nettoie();
$monObjet->embellis();
$monObjet->protege();
$monObjet->espace();
$monObjet->encadre();
$monObjet->affiche();

Quel est le problème avec ce code ? On instancie un objet, et on lui fait exécuter plusieurs méthodes d'affilée. Techniquement il n'y a aucun problème, l'emmerdant c'est la redondance, et pas la rose. Et comme nous manipulons le même objet à chaque fois, ce qui serait bien pratique c'est de pouvoir écrire les méthodes comme elles s'exécutent : les unes à la suite des autres. Comme ceci par exemple :

Code:

$monObjet = new MaClasse($texte);
$monObjet->nettoie()->embellis()->protege()->espace()->encadre()->affiche();

Qu'est-ce qui nous empêche d'écrire ce code? Pas grand chose en fait. Comme vous le voyez, chaque méthode doit permettre d'exécuter la suivante. Avec PHP5, les méthodes ont la possibilité de retourner des objets, ce qui est très pratique dans de nombreux autres cas. Dans notre cas, cela va être très simple, on a juste besoin de retourner l'objet courant ! Ainsi chaque méthode de la classe va retourner l'instance courante de la classe (l'objet) , permettant à la méthode suivante d'être appelée. Voici donc la classe, revue et corrigée pour permettre le chaînage des méthodes, en fait il suffit juste d'ajouter " return $this; " à la fin de chacune d'elles :

Code:

class MaClasse
{
   public $contenu;
   // Je nomme le constructeur comme la classe pour la compatibilité avec PHP4
   // Sinon vous pouvez utiliser function __construct()
   public function MaClasse($contenu)
   {
      $this->contenu = $contenu;
   }
   public function nettoie()
   {
      // On enlève des espaces inutiles aux extrémités
      $this->contenu = trim($this->contenu);
      return $this;
   }
   public function embellis()
   {
      // On ajoute une majuscule sur la première lettre
      $this->contenu = ucfirst($this->contenu);
      return $this;
   }
   public function protege()
   {
      // On enlève toutes les balises <script> et leur contenu
      $this->contenu = preg_replace('@<script[^>]*?>.*?</script>@si','',$this->contenu);
      // On enlève toutes les balises autres que <b> <i> <u>
      $this->contenu = strip_tags($this->contenu,'<b><i><u>');
      return $this;
   }
   public function espace()
   {
      // On ajoute des balises <br/> dans les sauts de lignes
      $this->contenu = nl2br($this->contenu);
      return $this;
   }
   public function encadre()
   {
      // On ajoute un joli cadre (bien entendu, je vous recommande class et non style...)
      $this->contenu = '<div style="border: 1px solid #DDDDDD; padding: 4px;">'.$this->contenu.'</div>';
      return $this;
   }
   public function affiche()
   {
      // Finalement, je n'aime pas faire un echo dans la classe
      return $this->contenu;
   }
}

Et maintenant pour l'utiliser je n'ai qu'à faire ceci :

Code:

$monObjet = new MaClasse($texte);
echo $monObjet->nettoie()->embellis()->protege()->espace()->encadre()->affiche();

Notez que cette fois-ci, la méthode affiche() ne fait pas d'echo, j'ai préféré le faire en dehors de la classe. Prenez d'ailleurs cette habitude de toujours faire des retours plutôt que des sorties directes. Ca vous permet plus de flexibilité dans le cas où vous voudriez l'afficher à un autre moment ou ailleurs, ou pas du tout...

Pour revenir au chaînage, vous constatez à quel point le code final est plus simple, moins redondant et peut apporter en lisibilité. Et encore, cet exemple est très simple, l'intérêt de cette méthode se révèle surtout quand les classes en agrégent d'autres... Le chaînage permet d'exécuter en une seule ligne, ou pas, de passer des méthodes d'une classe à une autre, mais je vous montrerais ça une prochaine fois.

Avez pas remarqué ce que faisait réellement ma classe ? C'est un filtre.
Revenir en haut Aller en bas
 
Leçon de PHP n°2.1 : La rentrée
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Leçon de PHP n°2.2 : Les Filtres
» Leçon de PHP n°2.3 : Les Templates
» Leçon de PHP n°1 : Les bases - niveau débutant
» Leçon de PHP n°2 : Les classes - niveau débutant

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
MacNOMODO :: A i d e  &  d é p a n n a g e :: Le labo (classé X)-
Sauter vers: