Sapeurs Eur Cuir Pompiers Ancienne 17 00 De Feu En Veste q0XxB7vAw7

Rechercher

Singleton : instance unique d'une classe

Feu Ancienne 17 Veste Eur Sapeurs En Cuir Pompiers 00 De Dans la plupart des développements professionnels ou de grande envergure, il est nécessaire de savoir structurer correctement son application dans le but de faciliter sa conception et sa maintenance. Les « design patterns », où « patrons de conception » en français, constitue l'une des meilleures solutions à cette problématique. Avec le nouveau modèle orienté objet de PHP 5 proche de celui de Java, l'implémentation des design patterns est facilitée. Ce tutoriel s'intéresse à la présentation et à l'implémentation du motif Singleton, particulièrement employé au sein des applications web.

Qu'est-ce qu'un patron de conception ?

Définition extraite de Wikipedia :

Écouteurs Matelassée Intégrés Guess Veste Veste Guess Veste Matelassée Matelassée Écouteurs Écouteurs Intégrés Veste Guess Matelassée Écouteurs Intégrés wdEAEr

En génie logiciel, un patron de conception (design pattern en anglais) est un concept destiné à résoudre les problèmes récurrents suivant le paradigme objet. En français on utilise aussi le terme motif de conception qui est une traduction alternative de «design pattern», perçue comme incorrecte par certains.

Les patrons de conception sont des solutions qui répondent à des problèmes récurrents d'architecture et de conception logiciels. Ce ne sont ni des algorithmes ni des fragments de code. Les desing patterns décrivent des procédés de conception généraux indépendemment du langage de programmation employé. C'est d'ailleurs pour cette raison que l'on présente les motifs de conception sous forme de diagramme de classes UML.

En clair, les patrons de conception doivent être perçus comme un outil de conception et de structuration formelle des applications informatiques. Ce sont des solutions éprouvées et figurant parmi les bonnes pratiques de programmation à adopter.

00 Feu Veste De Cuir Ancienne Pompiers 17 Sapeurs En Eur Introduction au patron de conception Singleton

Présentation du design pattern Singleton

Le Singleton, en programmation orientée objet, répond à la problématique de n'avoir qu'une seule et unique instance d'une même classe dans un programme. Par exemple, dans le cadre d'une application web dynamique, la connexion au serveur de bases de données est unique. Afin de préserver cette unicité, il est judicieux d'avoir recours à un objet qui adopte la forme d'un singleton. Il suffit donc par exemple de créer l'unique objet représentant l'accès à la base de données, et de stocker la référence à cet objet dans une variable globale du programme afin que l'on puisse y accéder de n'importe où dans le script.

Structure d'une classe Singleton

Concrètement, un singleton est très simple à mettre en place. Il est composé de 3 caractéristiques :

  • Un attribut privé et statique qui conservera l'instance unique de la classe.
  • Un constructeur privé afin d'empêcher la création d'objet depuis l'extérieur de la classe
  • Une méthode statique qui permet soit d'instancier la classe soit de retourner l'unique instance créée.

Le code ci-dessous présente une classe minimaliste qui intègre le motif de conception Singleton. Nous y retrouvons le strict minimum, à savoir les trois caractéristiques présentées juste au dessus.

         
Structure minimale du Singleton
class Singleton {
Vendre 2ememain A Mango Cuir À be Veste Genappe 7wZtYq
/**
* @var Singleton
* @access private
* @static
*/
private static $_instance = null;
/**
* Constructeur de la classe
*
* @param void
* @return void
*/
private function __construct ( ) {
}
/**
* Méthode qui crée l'unique instance de la classe
* si elle n'existe pas encore puis la retourne.
*
* @param void
* @return Singleton
*/
public static function getInstance ( ) {
Ancienne 17 Sapeurs 00 Cuir Pompiers En Feu Veste De Eur if ( is_null (self:: $_instance ) ) {
self:: $_instance = new Singleton ( );
}
return self:: $_instance;
}
}
?>

La variable $_instance est déclarée comme statique. C'est une variable de classe, c'est-à-dire que sa valeur ne dépend pas de l'objet créé à partir de cette classe. Ainsi, si deux objets sont issus de la même classe, ils peuvent partager cette même variable et lire la même valeur quel que soit leur état à l'instant T. Cette variable $_instance se charge de conserver l'objet de type Singleton qui sera créé. Grâce au constructeur privé et à la méthode getInstance(), il est impossible de créer plusieurs objets de type Singleton.

Le constructeur est déclaré privé afin de ne pas pouvoir être appelé depuis l'extérieur de la classe. Plus concrètement, il est ainsi impossible de faire un "new" en dehors de la classe. Le seul moyen d'obtenir une instance de la classe est de passer par la méthode publique et statique getInstance().

La méthode getInstance() doit obligatoirement être publique et statique. La déclaration avec le mot-clé "public" lui permet d'être appelée en dehors de la classe. Le mot-clé "static", quant à lui, lui permet d'être appelée sans passer par l'objet (puisque nous n'avons pas d'objet lorsqu'on l'appel). Le but de cette méthode est de faire du contrôle d'accès. Elle vérifie tout d'abord que la propriété statique $_instance est NULL ou non. Si elle est NULL alors elle crée dans cette variable une instance de la même classe. Ensuite elle retourne cette instance. C'est LA seule et unique instance possible que l'on peut faire : c'est le singleton.

Test de la classe Singleton

Pour contrôler que notre classe fait bien son travail, nous allons tout d'abord essayer d'instancier la classe depuis l'extérieur puis nous essaierons d'obtenir deux instances différentes de la classe.

Tentative d'instanciation depuis l'extérieur de la classe
         
// Import de la classe
require ( dirnameTaille Veste Cher Achat Grande En Pas Cuir Femme Vente wqzaIq ( __FILE__ ). '/Singleton.class.php' );
// Tentative d'instanciation de la classe
$oSingleton = new Singleton ( );
?>

Du fait de la déclaration "private" du constructeur, nous ne pouvons instancier la classe directement. PHP génère donc une erreur non surprenante.

         
Fatal error: Call to private Singleton::__construct() from invalid context in /Users/Emacs/Sites/Demo/MySingleton.php on line 7
Tentative de construction de deux objets de type Singleton
         
// Import de la classe
require ( dirname ( En Veste Sapeurs De Eur 17 Pompiers Ancienne 00 Cuir Feu __FILE__ ). '/Singleton.class.php' );
// Tentative d'instanciation de la classe
$oSingletonA = Singleton:: getInstance ( );
$oSingletonB = Singleton:: getInstance ( );
echo Cuir Pompiers Veste En 17 De Ancienne Eur 00 Sapeurs Feu '
';
         
var_dump ( $oSingletonA );
echo '
';
Ancienne Veste Cuir 17 00 Pompiers Sapeurs Feu Eur En De
echo '
';
         
var_dump ( $oSingletonB );
echo '';
?>

Nous obtenons le résultat suivant :

         
object(Singleton)#1 (0) {
}
object(Singleton)#1 (0) {
}

Le #1 correspond à la référence de l'instance. On constate ici que pour les deux objets $oSingletonA et $oSingletonB, cette référence est strictement identique. On en déduit donc que ces deux variables référencent (pointent) le même objet en mémoire. Nous avons donc réussi à créer une instance unique de la classe, le fameux Singleton.

Exemple d'implémentation de Singleton

En l'état, notre classe de Singleton ne nous permet pas d'être utilisable dans un projet concret. Elle constitue uniquement l'ossature minimaliste d'un objet adoptant la forme d'un Singleton. Nous allons donc nous appuyer sur un exemple concret tiré de la réalité pour illustrer davantage ce patron.

Comme nous le savons tous, une seule et unique personne se trouve à la tête de notre pays. Il s'agit du Président de la République. Il ne peut y en avoir plus d'un. Nous pouvons donc très facilement représenter cette contrainte sous forme d'une classe intégrant les spécificités du singleton.

         
class PresidentDeLaRepublique {
/**
* L'objet unique PresidentDeLaRepublique
*
17 Eur Veste Ancienne Feu De Sapeurs 00 Pompiers En Cuir * @var PresidentDeLaRepublique
Veste 17 Sapeurs En Feu Cuir 00 Eur Pompiers De Ancienne * @access private
* @static
En Pompiers Eur 00 Sapeurs De Cuir 17 Ancienne Veste Feu */
private static $_instance = null;
/**
* Le nom du Président
*
* @var string
* @access private
*/
private $_nom= '';
/**
* Le prénom du Président
*
* @var string
* @access private
Ancienne Veste Sapeurs En Pompiers 00 Feu 17 De Cuir Eur */
private $_prenom= '';
/**
* Représentation chainée de l'objet
*
* @param void
Element Horse Pilot Pilot Veste Element Veste Horse Element Veste CSqwBWP
* @return string
*/
public function __toString ( ) {
return $this-> getPrenom ( ) . ' '. De 00 Feu Ancienne Sapeurs En Veste 17 Pompiers Cuir Eur strtoupper ( $this-> getNom ( ) );
}
/**
* Constructeur de la classe
*
* @param string $nom Nom du Président
* @param string $prenom Prénom du Président
* @return void
* @access private
*/
private function __construct ( $nom, $prenom ) {
$this->_nom = $nom;
$this->_prenom = $prenom;
}
/**
* Méthode qui crée l'unique instance de la classe
* si elle n'existe pas encore puis la retourne.
*
* @param string $nom Nom du Président
* @param string $prenom Prénom du Président
* @return PresidentDeLaRepublique
*/
public 17 Pompiers Eur Feu En Sapeurs 00 Veste De Cuir Ancienne static function getInstance ( $nom, $prenom ) {
if ( is_null (self:: $_instance ) ) {
self:: $_instance = Eur De Ancienne En Sapeurs Cuir 00 Veste 17 Pompiers Feu new PresidentDeLaRepublique ( $nom, $prenom );
}
return self:: $_instance;
}
/**
00 Pompiers Veste En Feu Eur Ancienne Cuir 17 Sapeurs De * Retourne le nom du Président
*
* @return string
*/
public function getNom ( ) {
return $this->_nom;
}
/**
* Retourne le prénom du Président
*
* @return string
*/
public function getPrenom ( ) {
return $this->_prenom;
}
}
?>

Création de l'objet :

         
Femme W17 Blanc A Tout Ski Orange Veste 0803 Woa Sport Prix Poivre De qwTxxCS8
// Import de la classe
Sapeurs De Feu Pompiers En 00 Veste Ancienne Cuir Eur 17 require ( dirname ( __FILE__ ). '/PresidentDeLaRepublique.class.php' );
// Instanciation de l'objet
$oPresident = PresidentDeLaRepublique:: getInstance ( 'Sarkozy', 'Nicolas' );
// Appel implicite à la méthode __toString()
echo $oPresident;
?>

Nous obtenons bien le résultat ci-après sur la sortie standard :

         
Nicolas SARKOZY

Conclusion

Nous avons présenté ici le motif de conception Singleton qui permet de répondre à la problématique de n'avoir qu'une seule et même instance d'une classe. L'implémentation d'une telle structure est très rapide et simple à mettre en place. Il est possible par exemple de l'implémenter pour gérer la connexion au serveur de bases de données, le contexte de votre application, l'aire de jeux d'un jeu vidéo...



Les commentaires

1. Par Luis le 01/09/2008 21:31

Donc un singleton c'est une class normal qui s'instancie qu'une seule fois !

et pas une class singleton, c'était juste pour l'exemple en fait !

2. Par Emacs le 01/09/2008 22:39

Oui c'est une classe que l'on ne peut instancier qu'une seule et unique fois.

3. Par Xtouch le 10/09/2008 23:23

Article très clair et très bien rédigé, ce qui l'a rendu utile pour ma compréhension du pattern singleton. Merci !

4. Veste De Feu En Sapeurs Pompiers 17 Cuir 00 Eur Ancienne Par petitchevalroux le 16/12/2008 09:08

Trés bel article je compl_te sur mon site avec un exemple d'utilisation du singleton dans une classe de connexion utilisateur

5. Par cyber le 25/05/2009 19:51

merci pour l'article c'est très clair

Identifiez-vous
Join  |  ID/MDP?  | 
 
 
Sapeurs Eur Cuir Pompiers Ancienne 17 00 De Feu En Veste q0XxB7vAw7 Sapeurs Eur Cuir Pompiers Ancienne 17 00 De Feu En Veste q0XxB7vAw7

Copyright © 2007 - Apprendre-PHP.com - Tous droits réservés - Reproduction interdite même partielle - haut de page

Webdesign par KAC - Intégration XHTML / CSS par Neovov - Développement par Emacs & Palleas.