Mysql
 sql >> Database >  >> RDS >> Mysql

Come funzionano le classi statiche e singleton (database)

Si consideri l'esempio seguente che utilizza il modello di progettazione singleton per accedere all'istanza dell'oggetto database (lo scopo è riutilizzare la stessa connessione ancora e ancora attraverso l'applicazione)

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;
    }
}

ora, se devo utilizzare la classe in qualsiasi punto dell'applicazione, lo farei semplicemente in questo modo.

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

la chiamata a Database::getInstance(); usa il metodo statico. ciò che fa fondamentalmente è che ti impedisce di istanziare direttamente l'oggetto dichiarando il costruttore come privato e invece controlla se l'oggetto è già istanziato. se true, restituisce l'oggetto già istanziato. altrimenti crea nuovo e restituisce l'oggetto appena creato. questo assicura che la stessa connessione al database venga riutilizzata attraverso l'applicazione.