Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: madpitbull_99 en 12 Agosto 2011, 15:59 pm



Título: Introducción al patrón Singleton con PHP
Publicado por: madpitbull_99 en 12 Agosto 2011, 15:59 pm
Sin recurrir a una explicación de la Wikipedia (http://en.wikipedia.org/wiki/Singleton_pattern), 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
  1. <?php
  2.  
  3.    /*
  4.     *   Ejemplo de uso del patr&#243;n
  5.     *   Singleton
  6.     */
  7.    class singletonPattern {
  8.  
  9.        // Variable que almacenar&#225; la instancia
  10.        static private $instance = null;
  11.  
  12.        // Constructor de la clase
  13.        private function __construct() {
  14.  
  15.                // es private, por tanto
  16.                // no puede ser instanciada usando
  17.                // new.
  18.  
  19.            }
  20.    }
  21.  
  22. ?>
  23.  

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
  1. <?php
  2.  
  3.    /*
  4.     *   Ejemplo de uso del patr&#243;n
  5.     *   Singleton
  6.     */
  7.    class singletonPattern {
  8.  
  9.        // Variable que almacenar&#225; la instancia
  10.        static private $instance = null;
  11.  
  12.        // Constructor de la clase
  13.        private function __construct() {
  14.            // es private, por tanto
  15.            // no puede ser instanciada usando
  16.            // new.
  17.  
  18.        }
  19.  
  20.        static public function createInstance() {
  21.  
  22.            if (self::$instance == null) {
  23.                // Si la clase no ha sido instanciada
  24.                self::$instance = new singletonPattern();
  25.            }
  26.            return self::$instance;
  27.  
  28.        }
  29.  
  30.    }
  31.  
  32.    $obj = singletonPattern::createInstance();
  33.  
  34. ?>
  35.  

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.


Título: Re: Introducción al patrón Singleton con PHP
Publicado por: [u]nsigned en 12 Agosto 2011, 16:26 pm
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


Título: Re: Introducción al patrón Singleton con PHP
Publicado por: madpitbull_99 en 12 Agosto 2011, 16:46 pm
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
  1. <?php
  2.  
  3. /*
  4. *   Ejemplo de uso del patrón
  5. *   Singleton
  6. */
  7. class singletonPattern {
  8.  
  9. // Variable que almacenará la instancia
  10. static private $instance = null;
  11.  
  12. // Constructor de la clase
  13. private function __construct() {
  14. // es private, por tanto
  15. // no puede ser instanciada usando
  16. // new.
  17.  
  18. }
  19.  
  20. static public function createInstance() {
  21.  
  22. if (self::$instance == null) {
  23. // Si la clase no ha sido instanciada
  24. self::$instance = new singletonPattern();
  25. }
  26. return self::$instance;
  27.  
  28. }
  29.  
  30. public function sayHelloTo($name) {
  31. echo "Hello " . $name . "!";
  32. }
  33.  
  34. }
  35.  
  36. $obj = singletonPattern::createInstance()->sayHelloTo('mad');
  37.  
  38. print_r($obj);
  39.  
  40. ?>