Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como funcionam as classes estáticas vs singleton (bancos de dados)


Considere o exemplo a seguir, que usa o padrão de design singleton para acessar a instância do objeto de banco de dados. (o objetivo disso é reutilizar a mesma conexão repetidamente em todo o aplicativo)
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;
    }
}

agora, se eu tiver que usar a classe em qualquer lugar do aplicativo, eu simplesmente faria assim.
require_once('database.php');
$dbh = Database::getInstance();
$sth = $dbh->query('SELECT * FROM sometable');
$result = $sth->fetchAll(PDO::FETCH_ASSOC);

a chamada para Database::getInstance(); usa o método estático. o que isso basicamente faz é restringir você de instanciar diretamente o objeto declarando o construtor como privado e, em vez disso, verifica se o objeto já foi instanciado. se true então retorna o objeto já instanciado. senão crie um novo e retorne o objeto recém-criado. isso garante que a mesma conexão de banco de dados seja reutilizada em todo o aplicativo.