sql >> Databasteknik >  >> RDS >> Mysql

Hur statiska vs singleton-klasser fungerar (databaser)

Tänk på följande exempel som använder singleton-designmönstret för att komma åt instansen av databasobjekt.(Syftet med detta är att återanvända samma anslutning om och om igen genom hela applikationen)

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

nu om jag måste använda klassen var som helst i programmet skulle jag enkelt göra det så här.

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

anropet till Database::getInstance(); använder statisk metod. Vad detta i princip gör är att det begränsar dig från att direkt instansiera objektet genom att förklara konstruktorn som privat, och istället kontrollerar den om objektet redan är initierat. om sant, returnera redan instansierat objekt. annars skapa nytt och returnera nyskapat objekt. detta säkerställer att samma databasanslutning återanvänds genom hela applikationen.




  1. Multipel DB-anslutning i skenor

  2. Är PostgreSQL-funktioner transaktionella?

  3. Att skapa en utlösare för infogning av underordnade tabeller returnerar ett förvirrande fel

  4. Felsökning:För många omdirigeringar