z http://www.php.net/manual/en/class.pdo.phpSingleton PHP PDO
###### config.ini ######
db_driver=mysql
db_user=root
db_password=924892xp
[dsn]
host=localhost
port=3306
dbname=localhost
[db_options]
PDO::MYSQL_ATTR_INIT_COMMAND=set names utf8
[db_attributes]
ATTR_ERRMODE=ERRMODE_EXCEPTION
############
<?php class Database {
private static $link = null ;
private static function getLink () {
if (self :: $link) {
return self :: $link ;
}
$ini = _BASE_DIR . "config.ini" ;
$parse = parse_ini_file ($ini , true) ;
$driver = $parse [ "db_driver" ] ;
$dsn = "${driver}:" ;
$user = $parse [ "db_user" ] ;
$password = $parse [ "db_password" ] ;
$options = $parse [ "db_options" ] ;
$attributes = $parse [ "db_attributes" ] ;
foreach ($parse [ "dsn" ] as $k => $v) {
$dsn .= "${k}=${v};" ;
}
self :: $link = new PDO ($dsn, $user, $password, $options) ;
foreach ($attributes as $k => $v) {
self :: $link -> setAttribute (constant ("PDO::{$k}")
, constant ("PDO::{$v}")) ;
}
return self :: $link ;
}
public static function __callStatic ($name, $args) {
$callback = array (self :: getLink (), $name) ;
return call_user_func_array ($callback , $args) ;
}
} ?>
<?php // examples
$stmt = Database :: prepare ("SELECT 'something' ;") ;
$stmt -> execute () ;
var_dump ($stmt -> fetchAll ()) ;
$stmt -> closeCursor () ;
?>
moje pytania są następujące:
Co jest Singleton?
Co oznacza błąd statyczny/nie?
Co jest publiczna funkcja statycznego __callStatic (służy?
A jak mogę to zrobić, że PDO łączy się tylko do bazy danych, gdy są potrzebne? Takie jak kwerendy lub ucieczki? Więc jeśli klasa/przedmiot jest nieużywany to się nie łączy
Singletons zostały poddane dużo krytyki na przestrzeni lat i należy ich unikać, jeśli to możliwe. Jest to szczególnie ważne w środowiskach, w których wszystkie obiekty działają tylko dla żądania. Rozejrzyj się po SO, aby uzyskać więcej informacji. – Gordon
@gordon: Singletony nie są (!) Złym rozwiązaniem w ogóle. Są one bardzo użyteczne na przykład dla front-kontrolerów, obiektów-żądań itd. Ale również uważam, że nie jest to zalecane do używania z obiektami bazy danych. Ale nie możesz powiedzieć "po prostu ich unikaj", tak myślę. Jest to powszechny wzorzec projektowy i bardzo przydatny. –
@faileN Singletons są (!) Ogólnie złym rozwiązaniem. Nawet [Erich Gamma mówi to w dzisiejszych czasach] (http://www.informit.com/articles/printerfriendly.aspx?p=1404056). Nie będę się w to zagłębiał, ponieważ zostało to wystarczająco wyjaśnione w innym miejscu. Tak jak powiedziałem, [rozejrzyj się] (http://stackoverflow.com/search?q=singleton+php) – Gordon