PHP – Enchainer les méthodes d’une classe

Un petit retour avec une astuce du jour. Rien de bien impressionnant, mais qui a toujours son petit effet quand on le fait découvrir, notamment lors de formations. Aujourd’hui je vous explique brièvement comment assurer le chainage ou l’enchainement de plusieurs méthodes d’une classe en PHP. Pour être plus clair, je vais vous montrer comment appeler plusieurs méthodes d’une même classe en une seule ligne de code. Par exemple :

$unObjet = new uneClasse($text);
echo $unObjet->nettoie()->coupe()->prepare()->affiche('Avec un titre');

php-logo-elephant

Ceux qui utilisent des Frameworks, comme Zend Framework par exemple, ont déjà rencontré cette façon de faire, et je pense qu’ils peuvent confirmer le coté pratique de la chose.

Mais alors, comment ça se passe au niveau de la classe pour que je puisse moi-même proposer cette manière de programmer ?

Chacune des méthodes utilisées de cette manière doit permettre d’exécuter celle qui suit. Comme vous le savez, dans PHP 5 les méthodes ont la possibilité de retourner des objets, on va donc retourner l’objet courant pour que chaque méthode de la classe puisse retourner l’instance de l’objet courant, autorisant ainsi la méthode suivante à être appelée (via « return $this; »).

Exemple tout simple d’une classe permettant le chainage de méthodes :

<?php

// Voici une classe
class uneClasse{

    public $content;
   
    // Son constructeur avec un contenu à passer en argument
    public function __construct($content){
   
        $this->content = $content;
   
    }
   
    // Méthode qui va faire une sorte de nettoyage du contenu
    public function nettoie(){
   
        $this->content = ucfirst(trim(strip_tags($this->content)));
       
        return $this;
   
    }
   
    // Méthode qui va découper le contenu (50 carac.) pour une présentation par exemple
    public function coupe(){
   
        $this->content = substr($this->content, 0, 50).'...';
       
        return $this;
   
    }
   
    // Méthode qui va faire une sorte de petite mise en page du contenu
    public function prepare(){
   
        // Bien sûr, il faut utiliser le css plutôt que faire ainsi, mais on est dans la démo là :)
        $this->content = '<p style="border: 1px #000 solid; padding: 5px;">'.$this->content.'</p>';
       
        return $this;
       
    }
   
    // Méthode qui va renvoyer le contenu sous sa forme actuelle (avec un titre h1 ou non)
    public function affiche($titre = ''){
   
        // si titre ou non
        if(isset($titre) AND $titre != '')
        return '<h1>'.$titre.'</h1> '.$this->content;
        else
        return $this->content;
   
    }
   
}

$text = ' et voilà un <b>contenu</b> qui risque d\'être modifié, j\'en suis sûr. Mais c\'est pour la bonne cause ';

$unObjet = new uneClasse($text);
echo $unObjet->nettoie()->coupe()->prepare()->affiche('Avec un titre');

?>

La classe n’a pas de réelle utilité, mais c’est surtout pour vous montrer le principe et la manière de concevoir le chainage de méthode d’une classe en PHP 5.

Pour résumer ce qui se produit avec l’appel de l’exemple ci-dessus :
1 – le texte ($text) est nettoyé de ses balises, espaces en trop et force une majuscule de début de texte (méthode nettoie())
2 – le texte est coupé à 50 caractères et obtient « … » (méthode coupe())
3 – un cadre et un padding va englober ce texte (méthode prepare())
4 – puis le tout va être affiché via la fonction « echo » de php et avec un titre dans une balise h1 (méthode affiche())

ce qui renverra au navigateur :

<h1>Avec un titre</h1> <p style="border: 1px #000 solid; padding: 5px;">Et voilà un contenu qui risque d'être modifié, j'e...</p>

Voilà, maintenant vous savez comment ça fonctionne !

Si vous voulez compléter cette article ou si vous avez des questions n’hésitez pas :)

Bon code à tous.

Articles qui peuvent vous intéresser :

Comments
  1. gab master case
  2. Jacky
  3. LudiKadmin
  4. Thomas
  5. Juan
  6. correction bac 2013

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *


*