Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO Patron singleton

Estas en el tema de Patron singleton en el foro de PHP en Foros del Web. Hola amigos, tengo una duda respecto al patrón singleton, Teniendo una clase: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original class MiClase {     private static ...
  #1 (permalink)  
Antiguo 15/01/2016, 17:52
 
Fecha de Ingreso: diciembre-2015
Ubicación: México
Mensajes: 280
Antigüedad: 8 años, 4 meses
Puntos: 20
Patron singleton

Hola amigos, tengo una duda respecto al patrón singleton,

Teniendo una clase:

Código PHP:
Ver original
  1. class MiClase{
  2.    private static $objeto = null;
  3.    
  4.    public function __construct(){  
  5.    }
  6.  
  7.     public static function singleton(){
  8.        if(!isset(self::$objeto)){
  9.             self::$objeto = new self();
  10.        }
  11.        return self::$objeto;      
  12.    }
  13.  
  14. }

Que diferencia hay a :

Código PHP:
Ver original
  1. class MiClase{
  2.    private static $objeto = null;
  3.    
  4.    public function __construct(){  
  5.    }
  6.  
  7.     public static function singleton(){
  8.        if(!isset(self::$objeto)){
  9.            $miClase = __CLASS__;
  10.             self::$objeto = new $miClase;
  11.        }
  12.        return self::$objeto;      
  13.    }
  14.  
  15. }

Saludos!
  #2 (permalink)  
Antiguo 15/01/2016, 19:01
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Patron singleton

Ninguna diferencia en realidad.

Salvo que __CLASS__ es una constante dinámica y por lo tanto un valor utilizable, pero self no se puede usar como valor pues es una construcción del lenguaje.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 15/01/2016, 20:23
 
Fecha de Ingreso: enero-2016
Mensajes: 71
Antigüedad: 8 años, 3 meses
Puntos: 14
Respuesta: Patron singleton

Mmmm, no hay diferencias como bien te indica pateketrueke pero esto no es patron singleton ya que puedes hacer:
Código PHP:
Ver original
  1. new MiClase(); // Deberia dar un error
O tambien
Código PHP:
Ver original
  1. $obj = MiClase::singleton();
  2. $obj2 = (clone) $obj; // Deberia dar error
Tampoco deberia permitirte hacer esto otro:
Código PHP:
Ver original
  1. $obj = MiClase::singleton();
  2. $serialized = serialize($obj);
  3. $obj2 = unserialize($serialized); // No debería permitirlo tampoco.
Todas las opciones de arriba te crean un nuevo objeto cosa que no debería ya que el código debe permitir una y solo una instancia.
  #4 (permalink)  
Antiguo 18/01/2016, 09:48
 
Fecha de Ingreso: diciembre-2015
Ubicación: México
Mensajes: 280
Antigüedad: 8 años, 4 meses
Puntos: 20
Respuesta: Patron singleton

Hola amigos!
Se agradece sus respuestas!!

x_atrix, gracias por la aclaración, en base a los puntos que me comentaste, trate de actualizar la clase, creo q para el punto 1 y 2 se solucionaría, pero para el 3 la verdad no sé si es la solución o como se pueda hacer:

Código PHP:
Ver original
  1. abstract class MiClase{
  2.         private static $instancia = null;      
  3.  
  4.         public static function singleton(){
  5.             if(!isset(self::$instancia)){
  6.                 $c = __CLASS__;
  7.                 self::$instancia = new $c;
  8.             }
  9.             return $instancia;
  10.         }
  11.  
  12.         public function __clone(){
  13.             trigger_error('La clonacion de éste objeto no está permitida', E_USER_ERROR);
  14.         }
  15.     }

Gracias nuevamente y espero me puedas aclarar el punto 3
Saludos!
  #5 (permalink)  
Antiguo 18/01/2016, 15:00
 
Fecha de Ingreso: enero-2016
Mensajes: 71
Antigüedad: 8 años, 3 meses
Puntos: 14
Respuesta: Patron singleton

Aquí lo llevas...
Código PHP:
<?php 
/** 
 * Singleton class 
 */ 
class Singleton 
    
/** 
     * The instance of this class 
     * @var object 
     */ 
    
private static $instance null

    
/** 
     * Returns only one instance of this class 
     * @return object 
     */ 
    
public static function instance() { 
        if (!
self::$instance instanceof self
            
self::$instance = new self(); 

        return 
self::$instance
    } 

    
/** 
     * Private constructor 
     */ 
    
private function __construct() { 

    } 

    
/** 
     * No serialization allowed 
     */ 
    
public function __sleep() { 
        
trigger_error("No serialization allowed!"E_USER_ERROR); 
    } 

    
/** 
     * No cloning allowed 
     */ 
    
public function __clone() { 
        
trigger_error("No cloning allowed!"E_USER_ERROR); 
    }
}
  #6 (permalink)  
Antiguo 18/01/2016, 16:34
 
Fecha de Ingreso: diciembre-2015
Ubicación: México
Mensajes: 280
Antigüedad: 8 años, 4 meses
Puntos: 20
Respuesta: Patron singleton

Genial amigo!
Muchas gracias,
ya para terminar, sólo como duda,
que diferencia habría entre
declarar mi clase abstracta
ó
declarar mi clase normal pero el constructor privado?
  #7 (permalink)  
Antiguo 18/01/2016, 16:55
 
Fecha de Ingreso: diciembre-2015
Ubicación: México
Mensajes: 280
Antigüedad: 8 años, 4 meses
Puntos: 20
Respuesta: Patron singleton

Jaja, ya, ya me di cuenta q diferencia hay,
si se declara abstracta no la podría instanciar incluso dentro de mi función singleton...
Gracias por sus respuestas

Etiquetas: patron, singleton
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:44.