IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] [PHP5] Design Pattern Singleton pour connexion base de données


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut [POO] [PHP5] Design Pattern Singleton pour connexion base de données
    Bonsoir tout le monde, voila je suis débutant dans la POO et je viens de créer une classe qui me permet de me connecter a une base de données en utilisant PDO, le prob est que j'ai voulu utilisé le motif de conception "Singleton" mais je ne sais pas trop si ce que j'ai fait est juste ou pas. J'aimerai avoir votre avis ainsi que vos suggestions afin d'améliorer ma Classe, merci d'avance.

    voici la Classe en question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    52
    53
     
    <?php
     
    class DatabaseConnection
    {
        private static $_instance = null;
     
        private $_host;
        private $_user;
        private $_password;
        private $_dbname;
        private $_handle;
     
        private function __construct($dbname = 'nightkid')
        {
            $this->_host     = 'localhost';
            $this->_user     = 'root';
            $this->_password = '';
            $this->_dbname   = $dbname;
            $this->_handle   = null;
     
            try {
                $this->_handle = new PDO("mysql:host=$this->_host;dbname=$this->_dbname", $this->_user, $this->_password);
                $this->_handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                echo 'Connection established and database "' . $this->_dbname . '" selected.';
            } catch (PDOException $e) {
                die('Connection failed or database cannot be selected : ' . $e->getMessage());
            }
        }
     
        public function __destruct()
        {
            var_dump($this->_db); // Vérification
            if (!is_null($this->_handle)) {
                $this->_handle = null;
                echo 'Connection closed.';
            }
            var_dump($this->_db); // Une dernière vérification pour voir si l'objet a été détruit
        }
     
        public static function getInstance()
        {
            if (is_null(self::$_instance)) {
                self::$_instance = new self();
            }
            return self::$_instance;
        }
     
        public function handle()
        {
            return $this->_handle;
        }
    }
    Maintenant, par exemple, j'utilise cette Classe comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    <?php
     
    require_once 'DatabaseConnection.php';
     
    class Albums
    {
        private $_db;
        private $_sql;
        private $_statement;
     
        public function __construct()
        {
            $this->_db = DatabaseConnection::getInstance()->handle();
        }
     
        public function __destruct()
        {
            var_dump($this->_db); // Vérification
        }
     
        public function addAlbum($artist, $title)
        {
            try {
                $this->_sql = "INSERT INTO albums (artist, title) VALUES (:artist, :title)";
                $this->_statement = $this->_db->prepare($this->_sql);
                $this->_statement->bindParam(':artist', $artist);
                $this->_statement->bindParam(':title', $title);
                $this->_statement->execute();
                echo 'Album added.';
            } catch (PDOException $e) {
                die('Error->addAlbum() : ' . $e->getMessage());
            }
        }
     
        public function editAlbum($id, $artist, $title)
        {
            try {
                $this->_sql = "UPDATE albums SET artist = :artist, title = :title WHERE id = :id";
                $this->_statement = $this->_db->prepare($this->_sql);
                $this->_statement->bindParam(':id', $id);
                $this->_statement->bindParam(':artist', $artist);
                $this->_statement->bindParam(':title', $title);
                $this->_statement->execute();
                echo 'Album information updated.';
            } catch (PDOException $e) {
                die('Error->editAlbum() : ' . $e->getMessage());
            }
        }
     
        public function deleteAlbum($id)
        {
            try {
                $this->_sql = "DELETE FROM albums WHERE id = :id";
                $this->_statement = $this->_db->prepare($this->_sql);
                $this->_statement->bindParam(':id', $id);
                $this->_statement->execute();
                echo 'Album deleted.';
            } catch (PDOException $e) {
                die('Error->deleteAlbum() : ' . $e->getMessage());
            }
        }
     
        public function selectAlbum($id = null)
        {
            try {
                if ($id !== null && $id > 0) {
                    $this->_sql = "SELECT id, artist, title FROM albums WHERE id = :id";
                    $this->_statement = $this->_db->prepare($this->_sql);
                    $this->_statement->bindParam(':id', $id);
                } else {
                    $this->_sql = "SELECT id, artist, title FROM albums";
                    $this->_statement = $this->_db->prepare($this->_sql);
                }
                $this->_statement->setFetchMode(PDO::FETCH_ASSOC);
                $this->_statement->execute();
                return $this->_statement->fetchAll();
            } catch (PDOException $e) {
                die('Error->selectAlbum() : ' . $e->getMessage());
            }
        }
    }
    PS: J'aimerai aussi savoir si l'utilisation de la méthode magique "__destruct" dans la Classe "DatabaseConnection" est utile dans ce cas là ou pas.

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Ton singleton peut être contourné par clonage.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <pre>
    <?php
     
    class singleton
    {
        protected static $_instance = null;
     
        public $var;
     
        protected function __construct()
        {
            $this->var = 'ok';
        }
     
        public static function getInstance()
        {
            if (is_null(self::$_instance))
            {
                self::$_instance = new self();
            }
            return self::$_instance;
        }
    }
     
    $test = singleton::getInstance();
     
    $test2 = clone $test;
    $test2->var = 'ko';
     
    var_dump($test);
    var_dump($test2);
    Pour éviter ça, il faut rendre la fonction __clone() privée.

    Pour le destructeur, tel que tu l'as défini, je pense qu'il ne sert pas à grand chose. Eventuellement, pour faire propre, il faudrait se déconnecter de la base de données, mais mettre une variable à null est inutile : ces variables seront automatiquement purgées une fois le script terminé...

Discussions similaires

  1. POO design pattern Singleton avec Windev
    Par Atsibat dans le forum Contribuez
    Réponses: 2
    Dernier message: 30/11/2012, 13h57
  2. Réponses: 5
    Dernier message: 24/02/2010, 16h17
  3. Réponses: 1
    Dernier message: 29/08/2009, 09h44
  4. Réponses: 1
    Dernier message: 16/04/2009, 23h05
  5. Ecriture/ lecture fichier INI pour connexion base de données
    Par lyraaa dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 08/06/2007, 20h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo