Qu’est-ce qu’un Singleton ?
En programmation orientée-objet, il existe des patrons de conception, appelé Design Patterns, qui établissent des bonnes pratiques de développement, basées sur l’expérience. Les Design Patterns apportent des solutions éprouvées à des problématiques courantes. Ils sont divisés en 2 types :
- les GRASP qui définissent des fondamentaux
- les GoF (Gang of Four) qui se basent sur les GRASP et décrivent des modèles précis classés en 3 catégories : Créateurs, Structuraux et Comportementaux
Le Singleton est l’un des GoF les plus simples. Il est de type Créateur.
Son objectif est d’assurer l’existence unique d’une instance de classe, et de fournir une interface permettant de l’accéder directement et simplement.
Reprenons l’exemple du shortcode compteur de vues d’une page. Je souhaite m’assurer que le compte d’une page ne soit effectué qu’une seule fois même si le shortcode est inséré plusieurs fois par mégarde dans la page. La solution est d’utiliser le patron Singleton sur la classe qui gère ce shortcode.
Voici ce que ça donne en PHP :
L’instantiation de la classe est contrainte par redéfinition des méthodes __construct
, __clone
et __wakeup
.
La création d’une instance de la classe Sukellos_Singleton
ne peut être faite qu’en appelant la méthode static instance()
, qui s’assure de son caractère unique.
Qu’est-ce qu’un Trait ?
Les Traits sont apparus avec PHP 5.4. Ils permettent simplement de réutiliser des méthodes dans d’autres classes et sont ainsi une alternative à l’héritage traditionnel.
Par exemple, si je souhaite appliquer le patron Singleton à de nombreuses classes dans ma conception, cela m’évitera de copier / coller le code précédent au début de chacune d’entre elles.
Au lieu de cela, j’aurai simplement à écrire :
use Singleton;
Pratique !
Le code d’un Singleton sous la forme d’un Trait :
J’ai simplement remplacé la définition de la classe par trait
au lieu de class
.
Le code intégral
Le code complet de l’exemple précédent en utilisant le trait Singleton :
Il est possible de redéfinir une méthode du trait. C’est ainsi que je procède avec la méthode init()
afin d’affecter un comportement à ma classe Sukellos_Singleton
.