Introducción al patrón Singleton con PHP

Iniciado por madpitbull_99, 12 Agosto 2011, 15:59 PM

0 Miembros y 1 Visitante están viendo este tema.

madpitbull_99

Sin recurrir a una explicación de la Wikipedia, diré que un "singleton"; no es más que una
clase que no se puede instanciar más de una vez. En realidad es algo más complejo, pero para entender la idea, nos sirve ésta explicación.

Lo ideal es recurrir es éste patrón de diseño a partir de PHP5, aunque en PHP4 también se puede hacer, pero la clase se podrá instanciar más de una vez.

Partiremos desde el siguiente código:

Código (php) [Seleccionar]

<?php
 
    
/*
    *   Ejemplo de uso del patr&#243;n
    *   Singleton
    */
    
class singletonPattern {
 
        
// Variable que almacenar&#225; la instancia
        
static private $instance null;
 
        
// Constructor de la clase
        
private function __construct() {

                
// es private, por tanto
                // no puede ser instanciada usando
                // new.
 
            
}
    }
 
?>



Tenemos una clase llamada "singletonPattern", con una variable estática llamada "$instance", dicha variable indica si la clase ha sido instancia o no,
en caso de tener el valor "null" la clase no ha sido instanciada.

La siguiente función, no es más que el constructor de la clase, que como vemos es "private", por lo tanto, no podemos acceder a ella desde el exterior.
Al intentar crear un objeto de la clase, se producirá un error, ya que, no podrá ser instanciada mediante la palabra reservada "new".

Para resolver éste problema, crearemos otro objeto que instancie la clase por nosotros y que nos devuelva el objeto.

Código (php) [Seleccionar]

<?php
 
    
/*
    *   Ejemplo de uso del patr&#243;n
    *   Singleton
    */
    
class singletonPattern {
 
        
// Variable que almacenar&#225; la instancia
        
static private $instance null;
 
        
// Constructor de la clase
        
private function __construct() {
            
// es private, por tanto
            // no puede ser instanciada usando
            // new.
 
        
}
 
        static public function 
createInstance() {
 
            if (
self::$instance == null) {
                
// Si la clase no ha sido instanciada
                
self::$instance = new singletonPattern();
            }
            return 
self::$instance;
 
        }
 
    }
 
    
$obj singletonPattern::createInstance();
 
?>



Como vemos, se ha creado un método llamado "createInstance()" que nos devuelve una instancia/objeto de la clase "singletonPattern", la variable "$instance", al ser
privada, hay que acceder a ella usando la palabra reservadaself:: seguida del nombre de la variable.

Básicamente, la última función creada comprueba si el valor de $instance es null, o sea la clase no ha sido instanciada, sino, se crea y se devuelve una instancia del objeto.

Como último creamos una instancia de la clase usando la última función creada.



«Si quieres la paz prepárate para la guerra» Flavius Vegetius


[Taller]Instalación/Configuración y Teoría de Servicios en Red

[u]nsigned

Buena info, basicamente se trata de controlar por un miembro privado la 'instanciacion' de la clase, no?.

Tenes dos veces la sentencia __contruct en el primer script, eso podria confundir a mas de uno.

Saludos

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!

madpitbull_99

Gracias por el aviso, ya está corregido.

En principio se implementa éste patrón para que no tengas que instanciar la clase las veces que sean necesarias sino hacerlo solo una vez.

Un ejemplo muy básico sería:

Código (php, 36) [Seleccionar]
<?php

/*
*   Ejemplo de uso del patrón
*   Singleton
*/
class singletonPattern {

// Variable que almacenará la instancia
static private $instance null;

// Constructor de la clase
private function __construct() {
// es private, por tanto
// no puede ser instanciada usando
// new.

}

static public function createInstance() { 

if (self::$instance == null) {
// Si la clase no ha sido instanciada
self::$instance = new singletonPattern();
}
return self::$instance;

}

public function sayHelloTo($name) {
echo "Hello " $name "!";
}

}

$obj singletonPattern::createInstance()->sayHelloTo('mad');

print_r($obj);

?>




«Si quieres la paz prepárate para la guerra» Flavius Vegetius


[Taller]Instalación/Configuración y Teoría de Servicios en Red