de http://www.php.net/manual/en/class.pdo.phpPHP Singleton DOP
###### 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 () ;
?>
Mis preguntas son:
Lo que es Singleton?
¿Qué significa static/do?
¿Cuál es __callStatic public static function (utilizado para?
Y cómo lo hago, que DOP sólo se conecta a la base de datos cuando sea necesario? Tal como consulta o escapar? Así que si la clase/objeto no está en uso entonces no se conecta.
Singleton han sido objeto de muchas críticas en los últimos años y se debe evitar si es posible. Esto es especialmente cierto en entornos donde todos los objetos solo viven para la Solicitud. Eche un vistazo alrededor de SO para obtener más información. – Gordon
@gordon: Singletons no son (!) Una mala solución en general. Son muy útiles, por ejemplo, para controladores frontales, objetos de solicitud, etc. Pero también quiero que no se recomiende su uso con objetos de base de datos. Pero no se puede decir "simplemente evitarlos", creo. Es un patrón de diseño común y muy útil. –
@faileN Los Singletons son (!) Una mala solución en general. Incluso [Erich Gamma dice que hoy en día] (http://www.informit.com/articles/printerfriendly.aspx?p=1404056). No profundizaré en esto ya que esto se ha explicado suficientemente en otros lugares. Como dije, [eche un vistazo alrededor] (http://stackoverflow.com/search?q=singleton+php) – Gordon