Implementar el patrón singleton con PHP es muy sencillo y útil, pues nos permite tener una única instancia de una clase, de forma que ahorraremos memoria, sobretodo si esa clase es de uso frecuente.
En los desarrollos php normalmente se suele usar el patrón singleton en clases de conexión a Base de Datos, dado que constantemente se están usando. No sólo el por ahorro de memoria es válido declarar la clase de forma Singleton, sino porque evitamos errores de desbordamiento de memoria en bucles que a su vez requieran de hacer nuevas consultas a la Base de Datos.
Sin duda el patrón singleton esta por encima de cualquier otra solución, como la típica de usar variables globales que instancien la clase, no sólo por legibilidad del código, sino porque rompe la regla de encapsulamiento, la cual determina una correcta implementación del código orientado a objetos.
Patrón Singleton para PHP.
Para tener una única instancia de clase, tendriamos que tener un código así:
class DB { private static $_instance; /** * Constructor privado para evitar que sea instanciado. */ private function __construct() { } /** * Evitamos el clonaje del objeto. */ private function __clone() { } /** * Recupera una instancia de la clase, creandola si es necesario. * * @return DB */ public static function Instance() { if (!(self::$_instance instanceof self)) { self::$_instance = new self(); } return self::$_instance; } // Resto de funciones de la clase..... }
Como vemos, creamos una variable estática que almacenará la instancia y por la que se preguntará siempre que se quiera acceder a dicha clase mediante el metodo Instance.
Destacar que declaramos el constructor como privado, para evitar que se intente instanciar por error y también implementamos el método clone vacio, para evitar que la clase se clone.
Desde cualquier otra parte del código, accederemos a la clase Singleton de esta manera:
$db = DB::Instance();
O directamente sin crear una variable que la contenga, por ejemplo si la clase tuviera un método «query» que ejecutará una sentencia sql tipo SELECT, podría accederse direcamente así:
DB::Instance()->query($sql);
Nota: En el ejemplo de la clase Singleton, veis que en los comentarios del método Instance, sale «@return DB», es decir, especifica el tipo de devolución del método como la clase misma, que además de ser una realidad, esto sirve como truco para ayudar a programas como NetBeans a identar correctamente el código cuando la clase se declara sin instanciación explícita.
2094 visitas.
Dame pan y llámame singletonto!