No quiero crear una discusión sobre Singleton mejor que estática o mejor que global, etc. Leí docenas de preguntas sobre temas similares en SO, pero no pude encontrar una respuesta a esta pregunta ESPECÍFICA, por lo que Espero que alguien pueda ahora iluminarme respondiendo esta pregunta con uno (o más) EJEMPLOS simples reales, y no solo discusiones teóricas.PHP: ¿una capa de abstracción de base de datos utiliza una clase estática frente a un objeto singleton?
En mi aplicación tengo la clase DB típica abstraer la capa DB y para realizar tareas de base de datos sin tener que escribir todas partes en el código mysql_connect/mysql_select_db/mysql...
podría escribir la clase, ya sea como una clase estática:
class DB
{
private static $connection = FALSE; //connection to be opened
//DB connection values
private static $server = NULL; private static $usr = NULL; private static $psw = NULL; private static $name = NULL;
public static function init($db_server, $db_usr, $db_psw, $db_name)
{
//simply stores connections values, without opening connection
}
public static function query($query_string)
{
//performs query over alerady opened connection, if not open, it opens connection 1st
}
...
}
O como un SINGLETON:
class DBSingleton
{
private $inst = NULL;
private $connection = FALSE; //connection to be opened
//DB connection values
private $server = NULL; private $usr = NULL; private $psw = NULL; private $name = NULL;
public static function getInstance($db_server, $db_usr, $db_psw, $db_name)
{
//simply stores connections values, without opening connection
if($inst === NULL)
$this->inst = new DBSingleton();
return $this->inst;
}
private __construct()...
public function query($query_string)
{
//performs query over already opened connection, if connection is not open, it opens connection 1st
}
...
}
Luego, después en mi aplicación si quiero consultar la base de datos que podía hacer
//Performing query using static DB object
DB:init(HOST, USR, PSW, DB_NAME);
DB::query("SELECT...");
//Performing query using DB singleton
$temp = DBSingleton::getInstance(HOST, USR, PSW, DB_NAME);
$temp->query("SELECT...");
Para mí Singleton tiene la única ventaja de evitar declarar como static
cada método de la clase. Estoy seguro de que algunos de ustedes me podrían dar un EJEMPLO de ventaja real de singleton en este caso específico . Gracias por adelantado.
El que votó en contra podría por favor deje un comentario y explicar. –
No hay absolutamente ninguna necesidad de hacer que una clase de base de datos sea singleton o se comporte como una clase estática. Me refiero a qué propósito sirve? Si está buscando crear una aplicación que a la vez necesite dos conexiones de bases de datos diferentes, básicamente ya está arruinado. Y la inicialización lenta (de la conexión real) es perfectamente posible con una clase que permite instancias múltiples. –
@fireeyedboy: gracias por su comentario, pero no entiendo exactamente su punto. Al final, ¿crees que es mejor una clase única o estática y por qué? –