Rozważmy następujący przykład, który używa wzorca projektowego singleton, aby uzyskać dostęp do instancji obiektu bazy danych.(Celem tego jest ponowne użycie tego samego połączenia w całej aplikacji)
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;
}
}
teraz, jeśli muszę użyć klasy w dowolnym miejscu w aplikacji, po prostu zrobiłbym to w ten sposób.
require_once('database.php');
$dbh = Database::getInstance();
$sth = $dbh->query('SELECT * FROM sometable');
$result = $sth->fetchAll(PDO::FETCH_ASSOC);
wywołanie Database::getInstance();
używa metody statycznej. zasadniczo ogranicza to możliwość bezpośredniego tworzenia instancji obiektu poprzez zadeklarowanie konstruktora jako prywatnego, a zamiast tego sprawdza, czy obiekt jest już utworzony. jeśli true to zwróć już skonkretyzowany obiekt. w przeciwnym razie utwórz nowy i zwróć nowo utworzony obiekt. zapewnia to, że to samo połączenie z bazą danych jest ponownie wykorzystywane w całej aplikacji.