sql >> Base de Datos >  >> RDS >> Mysql

Cómo funcionan las clases estáticas vs singleton (bases de datos)

Considere el siguiente ejemplo que usa el patrón de diseño singleton para acceder a la instancia del objeto de la base de datos (el propósito de esto es reutilizar la misma conexión una y otra vez en toda la aplicación)

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

ahora, si tengo que hacer uso de la clase en cualquier parte de la aplicación, simplemente lo haría así.

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

la llamada a Database::getInstance(); utiliza el método estático. lo que esto hace básicamente es que le impide instanciar directamente el objeto al declarar el constructor como privado y, en su lugar, verifica si el objeto ya está instanciado. si es verdadero, devuelve el objeto ya instanciado. de lo contrario, cree un objeto nuevo y devuélvalo recién creado. esto asegura que la misma conexión de base de datos se reutilice en toda la aplicación.