Bonjour à tous et à toutes
Voilà une technique permettant d'éviter de dupliquer une instance d'une classe en php. Ce n'est rien d'autre que le Design Pattern Singleton.
Sans le design pattern singleton, effectuer cette action :
<span class="syntaxhtml"><span class="syntaxdefault"><?php$instance1 </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> new maClass</span><span class="syntaxkeyword">();</span><span class="syntaxdefault">$instance2 </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> new maClass</span><span class="syntaxkeyword">();</span><span class="syntaxdefault">?></span></span>
Aurait créée deux instances différentes de la classe.
Il vous est peut-être déjà arrivé d'avoir besoin d'utiliser plusieurs fois une instance d'une classe, sans vouloir en recréer une ? A première vue, ça vous semble impossible ? Et pourtant il existe une solution très facile d'utilisation, il s'agit de créer un singleton.
Le but du singleton est de créer une instance de la classe, si il n'en existe pas déjà une.
Concrètement, ça veut dire que si une instance de la classe existe, elle est retournée, sinon elle est créée. Le résultat est bénéfique car il évite de dupliquer son objet et donc permet l'économie de ressources.
En quelque sorte, si je fais ceci :
<span class="syntaxhtml"><span class="syntaxdefault"><?php$instance1 </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> maClass</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">getInstance</span><span class="syntaxkeyword">();</span><span class="syntaxdefault">$instance2 </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> maClass</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">getInstance</span><span class="syntaxkeyword">();</span><span class="syntaxdefault">?></span></span>
et que je compare $instance1 et $instance2, j'aurai un résultat identique, c'est pas dire que $instance2 aura la même instance que $instance1.
Passons maintenant au code :
<span class="syntaxhtml"><span class="syntaxdefault"><?phpclass maClass </span><span class="syntaxkeyword">{</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// Contient l'instance de la classe maClass</span><span class="syntaxdefault"> private static $_instance</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// Singleton</span><span class="syntaxdefault"> public static function getInstance</span><span class="syntaxkeyword">()</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// Si l'instance de la classe n'existe pas déjà</span><span class="syntaxdefault"> if</span><span class="syntaxkeyword">(!isset(</span><span class="syntaxdefault">self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">))</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// On la créée</span><span class="syntaxdefault"> self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> new self</span><span class="syntaxkeyword">();</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">}</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// On retourne l'instance</span><span class="syntaxdefault"> return self</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">$_instance</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">}}</span><span class="syntaxdefault">?></span></span>
Le code étant commenté, je ne m'attarde pas plus dessus, vous devriez être capable de le comprendre.
Maintenant, c'est à vous de rajouter vos méthodes comme vous l'auriez fait pour une classe sans le singleton. Pensez cependant à instancier votre classe de cette façon :
<span class="syntaxhtml"><span class="syntaxdefault"><?phpmaClasse</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">getInstance</span><span class="syntaxkeyword">()-></span><span class="syntaxdefault">methode</span><span class="syntaxkeyword">();</span><span class="syntaxcomment">// ou si vous le souhaitez :</span><span class="syntaxdefault">$instance </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> maClasse</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">getInstance</span><span class="syntaxkeyword">();</span><span class="syntaxdefault">$instance</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">methode</span><span class="syntaxkeyword">();</span><span class="syntaxcomment">// Mais pourquoi stocker l'objet dans une variable si on peut l'utiliser co mme ça ? (en plus ça prendre plus de place..)</span><span class="syntaxdefault">?></span></span>
Bref j'espère que j'ai été clair dans mes propos.
Bonne journée.
PS : Pour plus d'informations, merci de créer un nouveau sujet plutôt que de répondre dans celui-ci.