nov
17
2009

Singleton pour PDO

En me baladant sur le net, j’ai voulu voir si quelqu’un avait un modèle singleton pour instancier PDO d’une meilleure façon que moi. Et, j’ai rien trouvé.

Comme vous le savez sûrement, le patron Singleton sert à instancier une seule fois un objet et quand quelqu’un en a besoin, au lieu de ré instancier cet objet, il récupère la seule instance existante. Et voici le squelette du Singleton :

 PHP |  copy code |? 
01
class Example
02
{
03
    // instance de la classe
04
    private static $instance;
05
 
06
    // Un constructeur prive ; empêche la création directe d'objet
07
    private function __construct() 
08
    {
09
        echo 'Je suis construit';
10
    }
11
 
12
    // La méthode singleton
13
    public static function singleton() 
14
    {
15
        if (!isset(self::$instance)) {
16
            $c = __CLASS__;
17
            self::$instance = new $c;
18
        }
19
 
20
        return self::$instance;
21
    }
22
 
23
    // Exemple d'une méthode
24
    public function bark()
25
    {
26
        echo 'Woof!';
27
    }
28
 
29
    // Prévient les utilisateurs sur le clônage de l'instance
30
    public function __clone()
31
    {
32
        trigger_error('Le clônage n\'est pas autorisé.', E_USER_ERROR);
33
    }
34
}

En suivant ce modèle, j’ai donc créé mon singleton pour la classe PDO. Si vous ne le savez pas, PDO est une classe d’abstraction pour gérer la connexion avec une base de données. Voici donc le résultat obtenu :
 PHP |  copy code |? 
001
/**
002
 * Classe Connexion
003
 *
004
 * Singleton permettant de se connecter à la base de donnée, utilisée par toutes 
005
 * les classes qui ont besoin d'un accès à la base de donnée.  
006
 * Il y a de renseigner à l'interieur:
007
 * <ul>
008
 * <li>le type de base de donnée (mysql, sqllite, ...)</li>
009
 * <li>le nom de la base de donnée</li>
010
 * <li>le login et le mot de passe utilisateur du serveur SQL</li>
011
 * </ul>
012
 *
013
 * Cette classe ne permet que l'instanciation d'un objet PDO pour se connecter à la base de donnée.
014
 * Vous pouvez utiliser cette classe comme ceci:
015
 * <pre>
016
 *  $db = connexion::getInstance();
017
 *  $con = $db->getDbh();
018
 * </pre>
019
*
020
* @link http://fr3.php.net/manual/fr/book.pdo.php classe PDO
021
*
022
* @author Benjamin Besse
023
* @version 0.4
024
* @package Connexion
025
* @copyright Benjamin Besse
026
* @todo
027
*
028
<ul>
029
<ul>*
030
	<li>0.1: création de la classe Connexion</li>
031
</ul>
032
</ul>
033
*
034
<ul>
035
	<li>0.2: passage de la classe en design patern singleton</li>
036
</ul>
037
*
038
<ul>
039
	<li>0.3: ajout de l'encodage par défaut en UTF-8 à la lecture</li>
040
</ul>
041
*
042
<ul>
043
	<li>0.4: ajout d'un try cath pour la gestion d'erreur au niveau de la connexion à la base de donnée</li>
044
</ul>
045
*
046
 
047
*/
048
class connexion
049
{
050
/**
051
* Instance de la classe connexion
052
* @access private
053
* @var connexion
054
* @see getInstance
055
*/
056
private static $instance;
057
 
058
/**
059
* Type de la base de donnée.
060
* @access private
061
* @var string
062
* @see __construct
063
*/
064
private $type = "mysql";
065
 
066
/**
067
* Adresse du serveur hôte.
068
* @access private
069
* @var string
070
* @see __construct
071
*/
072
private $host = "localhost";
073
 
074
/**
075
* Nom de la base de donnée.
076
* @access private
077
* @var string
078
* @see __construct
079
*/
080
private $dbname = "legendesfeeriques";
081
 
082
/**
083
* Nom d'utilisateur pour la connexion à la base de données
084
* @access private
085
* @var string
086
* @see __construct
087
*/
088
private $username = "root";
089
 
090
/**
091
* Mot de passe pour la connexion à la base de donnée
092
* @access private
093
* @var string
094
* @see __construct
095
*/
096
private $password = '';
097
 
098
private $dbh;
099
 
100
/**
101
* Lance la connexion à la base de donnée en le mettant
102
* dans un objet PDO qui est stocké dans la variable $dbh
103
* @access private
104
*/
105
private function __construct()
106
{
107
try
108
{
109
$this-&gt;dbh = new PDO($this-&gt;type.':host='.$this-&gt;host.'; dbname='.$this-&gt;dbname, $this-&gt;username, $this-&gt;password,
110
array(PDO::ATTR_PERSISTENT =&gt; true));
111
$req = "SET NAMES UTF8";
112
$result = $this-&gt;dbh-&gt;prepare($req);
113
$result-&gt;execute();
114
}
115
catch(PDOException $e)
116
{
117
echo "
118
<div class="\&quot;error\&quot;">Erreur !: ".$e-&gt;getMessage()."</div>
119
";
120
die();
121
}
122
}
123
 
124
/**
125
* Regarde si un objet connexion a déjà été instancier,
126
* si c'est le cas alors il retourne l'objet déjà existant
127
* sinon il en créer un autre.
128
* @return $instance
129
*/
130
public static function getInstance()
131
{
132
if (!self::$instance instanceof self)
133
{
134
self::$instance = new self;
135
}
136
return self::$instance;
137
}
138
 
139
/**
140
* Permet de récuprer l'objet PDO permettant de manipuler la base de donnée
141
* @return $dbh
142
*/
143
public function getDbh()
144
{
145
return $this-&gt;dbh;
146
}
147
}

Et je l’appelle comme ceci dans mes classes :

 PHP |  copy code |? 
01
class Circuit
02
{ 
03
 private $con; //variable de connexion
04
 
05
 public function __construct()
06
 {
07
 $db = connexion::getInstance();
08
 $this->con = $db->getDbh();
09
 }
10
}

A partir de là, toutes les fonctions de PDO sont réutilisables sans avoir besoin de les redéfinir. J’espère avoir pu vous aider avec ceci.

Articles Connexes

A propos de l'Auteur: Benjamin Besse

Je suis Analyste Développeur chez Goomeo et je suis passioné par tout ce qui touche aux technologies du Web. J'ai commencé par apprendre l'utilisation du Framework Zend et j'ai continué naturellement via Android. Le tout seulement avec les bases acquises en DUT et Licence professionnelle Informatique.

Laisser un commentaire

Mots-Clefs