Classe MySQL personnalisée : Amélioration de PDO

Posted on the juillet 5th, 2008 under Développement, PHP by Palleas

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.

Cette classe est vraiment très 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 FrameWork 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 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. Pour plus d’informations sur le singleton, je vous renvoi vers le billet de Nicolas ou celui d’Hugo.


class MyClass extends PDO {
private function __construct($path,$user,$pass) {
parent::__construct($path,$user,$pass);
}
}
?>

Vous croyiez vraiment que ça allait être aussi simple? Essayez d’exécuter ce script, et vous aurez le 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

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 :


class SPDO {
private $PDOInstance = null;
const DEFAULT_SQL_USER = 'user';
const DEFAULT_SQL_HOST = 'localhost';
const DEFAULT_SQL_PASS = 'xxxxxxxxx';
const DEFAULT_SQL_DTB = 'database';
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 :


class SPDO {
private $PDOInstance = null;
private static $instance = null;
const DEFAULT_SQL_USER = 'user';
const DEFAULT_SQL_HOST = 'localhost';
const DEFAULT_SQL_PASS = 'xxxxxxxxx';
const DEFAULT_SQL_DTB = 'database';
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);
}
public static function getInstance() {
if(is_null(self::$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. Je posterais bientôt ma classe. En attendant, pardon pour la délicate lisibilité du code fournit, mais avec un saut de ligne ou une tabulation, le style saute…

2 Responses to 'Classe MySQL personnalisée : Amélioration de PDO'

Subscribe to comments with RSS
  1. NoOne said, on septembre 13th, 2008 at 19:17Reply to this comment

    J’fais remonter un vieux post.
    Mais en fait, j’me demandais pourquoi tu utilisais deux variables :
    private $PDOInstance = null;
    private static $instance = null;

  2. Palleas said, on septembre 13th, 2008 at 19:45Reply to this comment

    La première est l’instance de PDO, vu qu’on ne peut implémenter le Singleton en héritant, on utilise la composition. La deuxième c’est l’instance de la classe SPDO, puisque la on implémente le Singleton.

Leave a Reply
XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>