Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

PHP OO Patron singleton y composicion

Estas en el tema de Patron singleton y composicion en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buen día y gracias por detenerse a leer este tema: Estoy muy nuevo en esto de la POO pero gracias a Dios me ha ido ...
  #1 (permalink)  
Antiguo 11/10/2011, 09:11
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 19 años, 6 meses
Puntos: 394
Patron singleton y composicion

Buen día y gracias por detenerse a leer este tema:

Estoy muy nuevo en esto de la POO pero gracias a Dios me ha ido bien, el problema que se me presenta es que yo se como instanciar una clase dentro de otra, lo hago de esta forma:

Código PHP:
Ver original
  1. public function __construct($instanciaClaseA = null)
  2. {
  3.     if(null === $instanciaClaseA) {
  4.         $instanciaClaseA = new ClaseA();
  5.     }
  6.     $this->instanciaCLaseA = $instanciaClaseA;
  7.  
  8. }

Hasta aquí todo va perfecto, pero resulta que estoy empezando con el PATRÓN SINGLETON, y quiero instanciar una clase que posee este patrón dentro de otra clase, me pregunto si de esta forma estará correcta la forma de instanciar o existe algo mas profesional:

Código PHP:
Ver original
  1. public function __construct($instanciaClaseA = null)
  2. {
  3.     if(null === $instanciaClaseA) {
  4.         $instanciaClaseA = DB::getInstance();
  5.     }
  6.     $this->instanciaCLaseA = DB::getInstance();
  7. }

De esa forma esta bien ?
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #2 (permalink)  
Antiguo 11/10/2011, 09:34
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Patron singleton y composicion

Pues si estas usando singleton, para que comparas (y la pasas por parámetro):
Código PHP:
Ver original
  1. public function __construct()
  2. {
  3.           $this->claseA = ClaseA::getInstance();
  4. }

Por otro lado busca en el foro, no es recomendable usar Singleton para tus clases DB.

Saludos.
  #3 (permalink)  
Antiguo 11/10/2011, 10:10
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 19 años, 6 meses
Puntos: 394
Respuesta: Patron singleton y composicion

Muchas gracias por la corrección, ya mismo busco porque no es recomendable usar singleton en clases DB
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #4 (permalink)  
Antiguo 12/10/2011, 13:28
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 23 años
Puntos: 69
Respuesta: Patron singleton y composicion

jataincubus, cómo estás?
Te cuento un poco como utilizo yo el tema de los Singletons, en algunas clases. Generalmente, como dicen Singletons no están mucho mejor que utilizar variables globales.

No es que estén mal de por si, solamente son complicadas a la hora de testear, en incluso hacen que tu código sea un poco más cerrado a cambios, por lo cual siempre es recomendable que tus clases puedan recibir clases como parámetros, y si no se lo definiste de antamano, utilizar alguna clase por defecto.

Esto es lo que hago yo:

Código PHP:
<?php
class ClaseA
{
    protected 
$_instance null;

    
/** Tipico Singleton */
    
public function getInstance()
    {
        if(
null === $this->_instance)
        {
            
$this->_instance = new self();
        }
        
        return 
$this->_instance;
    }
}

/** Esta es la clase que va a utilizar internamente a ClaseA */
class ClaseB 
{
    protected 
$_clasea null;

    public function 
__construct(ClaseA $clasea null)
    {
        
/** No pregunto si es null o no, seteo directamente */
        
$this->setClaseA($clasea);
    }
    
    public function 
setClaseA($clasea)
    {
        
/** acá tampoco pregunto, simplemente seteo */
        
$this->_clasea $clasea;
    }
    
    
/**
     * Acá viene "el truco". Cuando yo necesito utilizar una ClaseA, 
     * utilizo este método para pedirlo siempre. Si al momento de necesitarlo
     * no lo tengo instanciado, entonces recién acá lo instancio. Es 
     * una especie también de LazyLoad.
     */
    
public function getClaseA()
    {
        
/** Acá si pregunto si es null */
        
if(null === $this->_clasea) {
            
$this->_clasea ClaseA::getInstance();
        }
        return 
$this->_clasea;
    }
}
Así es como te quedan varias maneras de setear la clase interna, y si ninguna fue utilizada, entonces "defaulteas" a utilizar el Singleton:

Código PHP:
/** Setearlo al momento de instanciación */
$claseb = new ClaseB(new ClaseA);

/** Setearlo utilizando un método */
$claseb->setClaseA(new ClaseA);

/** Utilizando la versión por defecto si no se indicó antes */
$claseb = new ClaseB();
$clasea $claseb->getClaseA(); // Devuelve ClaseA::getInstance() 
Espero que te sirva esto !
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com

Etiquetas: clase, composicion, patron, poo, 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 01:15.