Category Archives: Singleton

Le pattern Singleton

Le pattern singleton, un joli nom pour un puissant pattern très simple à mettre en place. Le principe du singleton est de restreindre l’instanciation à un seul et unique objet. Ainsi nous aurons toujours le même identifiant d’objet. Dans le cas d’une connexion à une base de données par exemple, dans la majeure partie des cas, nous ne voulons qu’un seul thread.

Voici donc un exemple de connexion avec PDO suivant le pattern Singleton

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**
* Class db, renvoie une instance de connexion à la base de données
*
* @abstract
*/
abstract class Gmsiweb_Db_Pdo
{
    /**
  * Objet PDO
  *
  * @var Gmsiweb_Db_Pdo
  */
    private static $_instance;
    private function __construct() { }
    private function __clone() { }
    /**
  * Renvoie l'instance de connexion à la base de données
  *
  * @static
  * @param string $db Nom de la base de données
  * @return PDO
  */
    public static function getInstance($db)
    {
        if(!isset(self::$_instance)) {
            $config = Gmsiweb_Config_Ini::getDbConfig($db);
            try{
                self::$_instance = new PDO(
                    'mysql:host=' . $config['pdo.host'] .';dbname=' .
                    $config['pdo.dbname'],
                    $config['pdo.username'],
                    $config['pdo.password'],
                    array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'')
                );
                self::$_instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            } catch (PDOException $e) {
                echo $e->getMessage();
            }
            
            if(!is_object(self::$_instance)) {
                throw new Gmsiweb_Exception('Erreur de connexion à la base de données');
            }
        }
        return self::$_instance;
    }
}
?>

Avec cet exemple, pour récupérer une instance de connexion à la base, il suffira de faire

PHP
1
2
3
<?php
$instance = Gmsiweb_Db_Pdo::getInstance('db');
?>

Simple non ?