Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie statische vs. Singleton-Klassen funktionieren (Datenbanken)

Betrachten Sie das folgende Beispiel, das das Singleton-Entwurfsmuster verwendet, um auf die Instanz des Datenbankobjekts zuzugreifen

class Database {

    protected static $_dbh;
    const HOST = 'localhost';
    const DATABASE = 'dbname';
    const USERNAME = 'username';
    const PASSWORD = 'password';

    //declare the constructor as private to avoid direct instantiation.   
    private function __construct() { }

    //access the database object through the getInstance method.
    public static function getInstance() {
        if(!isset($_dbh)) {
            #Connection String.
            self::$_dbh = new PDO('mysql:host='.self::HOST.';dbname='.self::DATABASE,self::USERNAME,self::PASSWORD);
            self::$_dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        return self::$_dbh;
    }
}

Wenn ich die Klasse jetzt irgendwo in der Anwendung verwenden muss, würde ich es einfach so machen.

require_once('database.php');
$dbh = Database::getInstance();
$sth = $dbh->query('SELECT * FROM sometable');
$result = $sth->fetchAll(PDO::FETCH_ASSOC);

der Aufruf von Database::getInstance(); verwendet statische Methode. Was dies im Grunde tut, ist, dass es Sie daran hindert, das Objekt direkt zu instanziieren, indem Sie den Konstruktor als privat deklarieren, und stattdessen prüft es, ob das Objekt bereits instanziiert ist. wenn wahr, dann bereits instanziiertes Objekt zurückgeben. sonst neues erstellen und neu erstelltes Objekt zurückgeben. Dadurch wird sichergestellt, dass dieselbe Datenbankverbindung in der gesamten Anwendung wiederverwendet wird.