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.