Trait Singleton en php

Iniciado por alexander1712, Octubre 09, 2013, 02:57:38 PM

Tema anterior - Siguiente tema

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

Siguiendo con mi idea de armarme pequeños modulos que realizen el trabajo importante y así yo solo los incluyo a la hora de crear un proyecto y no me tengo que gastar en escribir el mismo codigo miles de veces, les traigo singleton para que lo puedan implementar en sus clases.

La idea la saqué de una publicación de Xtempp en respuesta a mi post de Property, pero la mejoré un poquito.

¿qué es singleton?
Normalmente nosotros al usar objetos y clases, creamos varios objetos de la misma clase, de hecho yo he tenido arreglos llenos de objetos de x clase representando registros de una tabla, por ejemplo.
Si bien esto es normal usarlo de esta manera en cualquier lenguaje, (en c++ con listados por ejemplo), y es el uso original de las clases, permitirle definir estructuras y luego completar sus atributos con valores creando diferentes objetos (previamente instanciando dicha clase a la que le llamamos estructura)
No obstante se puede dar el caso de que nosotros únicamente queramos crear un objeto y manejar siempre el mismo objeto, creamos una clase para que solo tenga un objeto porque por algún motivo no nos interesa tener más de un objeto de dicha clase (lo que sucede en raros casos), no obstante, aquí es donde entra Singleton, que permite obtener la instancia de una clase que se guarda en la misma clase, de ese modo, cada vez que querramos usar la instancia de la clase (la única instancia) podemos obtener su instancia desde una función estática.

Dejando todas las explicaciones de lado, les dejo mi trait, que de la forma que está programado puede usarse en cualquier clase solo poniendo use Singleton;

Código: php
<?php

trait Singleton
{

    static private $instancia = null;
   
    static public function GetInstancia()
    {
        if(!(self::$instancia instanceof __CLASS__))
        {
            self::$instancia = new __CLASS__;
        }
        return self::$instancia;
    }
   
    public function __clone()
    {
        trigger_error('No es posible realizar la clonación', E_USER_ERROR);
    }

}


lo único que tienen que hacer en su clase para que acepte Singleton es poner

Código: php
class miclase
{
use Singleton;

    ... resto del código

}


y si además quicieran usar mi property por ejemplo podrían poner así:

Código: php
class miclase
{
use Singleton, Property;

    ... resto del código

}


saludos!