Abrir y cerrar conexiones a la base de datos en cada script es un error de principiante. En 2026, la eficiencia lo es todo. El patrón Singleton asegura una única conexión para toda la ejecución.
Solución Rápida (Code Snippet)
Copia esta clase profesional para gestionar tus conexiones PDO de forma centralizada.
<?php
declare(strict_types=1);
class Database {
private static ?PDO $instance = null;
public static function getConnection(): PDO {
if (self::$instance === null) {
try {
$host = 'localhost';
$db = 'mi_proyecto';
$user = 'root';
$pass = '';
$dsn = "mysql:host=$host;dbname=$db;charset=utf8mb4";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
self::$instance = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
die("Error de conexión: " . $e->getMessage());
}
}
return self::$instance;
}
// Evitar clonación o instanciación externa
private function __construct() {}
private function __clone() {}
}
// Uso:
// $pdo = Database::getConnection();
Cómo funciona
- Propiedad Estática:
$instanceguarda la conexión. Al ser estática, persiste durante toda la vida de la petición (request). - Constructor Privado: Impide que alguien haga
new Database(). Solo se puede acceder vía el método estático. - Lazy Initialization: La conexión solo se crea la primera vez que llamas a
getConnection(). Si tu script no necesita la base de datos, nunca se conecta. - Configuración PDO:
ERRMODE_EXCEPTION: Lanza errores reales de PHP que puedes capturar.EMULATE_PREPARES => false: Usa sentencias preparadas nativas de MySQL, mucho más seguras.
Beneficios
- Ahorro de Recursos: Menos carga para el servidor MySQL.
- Punto Único de Fallo: Si cambias la contraseña de la DB, solo la cambias en un archivo.
Enlaces Internos
- Usa esta conexión para tu Sistema de Login Seguro.
- Implementa búsquedas rápidas con Índices en MySQL.
Preguntas Frecuentes
¿Puedo tener múltiples bases de datos con Singleton?
Sí, podrías modificar el patrón para aceptar un parámetro o crear clases como DatabaseUser y DatabaseLogs que sigan el mismo principio.
¿El Singleton es malo para los tests?
En Unit Testing puro puede ser difícil de “mockear”, pero para aplicaciones de tamaño medio/grande en PHP es una solución pragmática y extremadamente efectiva.