Classe singleton d'accès aux SGBD intégrant PDO
- Par Palleas
- 0 commentaire
- 1 562 lectures
- Format PDF
- RSS - Atom
J'ai commencé à créer ma propre classe d'accès aux bases de données car j'avais véritablement envie d'implémenter des interfaces telles que Iterator ou Countable. Seulement voilà, il existe déjà une classe de ce type native à PHP : PDO.
Présentation brève de l'extension PDO
Cette classe est particulièrement intéressante et pratique à utiliser car elle gère directement l'abstraction (comprenez qu'elle ne dépend pas d'un Système de Gestion de Base de Données (SGBD) pour fonctionner), la protection des données, les requêtes préparées, etc. En y reflechissant, je me suis dit que j'étais en train de perdre mon temps à essayer de refaire ce qui se fait déjà, probablement en moins bien ! C'est une chose de ne pas aimer le code tout fait (i.e. les Frameworks PHP), c'en est une autre de ne pas vouloir utiliser les classes natives.
Il y a cependant certaines choses que j'aimerai retrouver dans PDO : notamment le design pattern Singleton. C'est parti pour la conception de ma classe que j'ai nommée très sobrement SPDO (Singletoned-PDO, sympa non ?).
Le pattern Singleton
Le singleton c'est quoi ? C'est une manière de s'assurer de ne disposer que d'une seule instance de votre classe durant toute l'exécution du script. Il y aurait bien la solution de déclarer PDO dans une variable en tête d'une page appelée systématiquement mais pour moi, cette solution est à proscrire.
Singleton : redéfinition du constructeur en accès private<?phpclass MyClass extends PDO{/*** Constructeur** @param string $path* @param string $user* @param string $path* @return void* @access private* @see PDO::__construct()*/private function __construct($path, $user, $pass){parent::__construct($path, $user, $pass);}}?>
Vous croyez vraiment que ça allait être aussi simple? Essayez d'instancier la classe MyClass, et vous aurez droit au message suivant :
Fatal error: Access level to MyClass::__construct() must be public (as in class PDO) in /path/to/your/script/pdo.class.php on line 6
Vous avez cependant la possibilité de faire un presque-singleton en laissant simplement le constructeur publique, mais pour moi ce serait tout simplement une hérésie. La solution est donc la composition.
Présentation de la classe SPDO
Qu'est ce que la composition ? C'est une autre manière de voir la programmation orientée objet, au même titre que l'héritage. C'est à dire que de cette manière nous allons nous contenter de stocker dans la classe une instance de PDO, plutôt que d'en hériter :
<?phpclass SPDO{/*** Instance de la classe SPDO** @var SPDO* @access private*/private $PDOInstance = null;/*** Constante: nom d'utilisateur de la bdd** @var string*/const DEFAULT_SQL_USER = 'user';/*** Constante: hôte de la bdd** @var string*/const DEFAULT_SQL_HOST = 'localhost';/*** Constante: hôte de la bdd** @var string*/const DEFAULT_SQL_PASS = 'xxxxxxxxx';/*** Constante: nom de la bdd** @var string*/const DEFAULT_SQL_DTB = 'database';/*** Constructeur** @param void* @return void* @see PDO::__construct()*/public function __construct(){$this->PDOInstance = new PDO('mysql:dbname='.self::DEFAULT_SQL_DTB.';host='.self::DEFAULT_SQL_HOST,self::DEFAULT_SQL_USER ,self::DEFAULT_SQL_PASS);}}?>
Vous avez ensuite la possibilité d'implémenter votre Singleton :
<?phpclass SPDO{/*** Instance de la classe PDO** @var PDO* @access private*/private $PDOInstance = null;/*** Instance de la classe SPDO** @var SPDO* @access private* @static*//*** Constante: nom d'utilisateur de la bdd** @var string*/const DEFAULT_SQL_USER = 'user';/*** Constante: hôte de la bdd** @var string*/const DEFAULT_SQL_HOST = 'localhost';/*** Constante: hôte de la bdd** @var string*/const DEFAULT_SQL_PASS = 'xxxxxxxxx';/*** Constante: nom de la bdd** @var string*/const DEFAULT_SQL_DTB = 'database';/*** Constructeur** @param void* @return void* @see PDO::__construct()* @access private*/private function __construct(){$this->PDOInstance = new PDO('mysql:dbname='.self::DEFAULT_SQL_DTB.';host='.self::DEFAULT_SQL_HOST,self::DEFAULT_SQL_USER ,self::DEFAULT_SQL_PASS);}/*** Crée et retourne l'objet SPDO** @access public* @static* @param void* @return SPDO $instance*/{{self::$instance = new SPDO();}return self::$instance;}}?>
Enfin, en redéfinissant les méthodes query() ou prepare() de PDO, vous aurez la possibilité d'ajouter un log des requêtes exécutées, etc.
Les commentaires
Soyez le premier à réagir !
