Videotutorial: Patrones de diseño en PHP – Singleton Pattern

Hoy os traigo el primero de una serie de videos cortos en los que voy a explicar algunos de los patrones diseño OOP más comunes en PHP. Un patrón de diseño consiste en una solución a un problema común en el desarrollo de software. En el caso de PHP, estos patrones son los que nos permiten aprovechar realmente toda la potencia de orientación a objetos de PHP5. Estos videos no pretenden ser tutoriales exhaustivos, sino simplemente una visión general y rápida de en qué consiste cada patrón, para aquellos que no estén familiarizados con esta metodología.

Empezaremos con el patrón Singleton, ya que es el más fácil de entender y utilizar. Hay varias maneras de implementar una clase singleton, pero aquí os voy a mostrar la forma más sencilla.

Ver screencast (duración: 6:00)

 

Podéis ver el resto de screencasts en la página de videotutoriales, o suscribiros al podcast de iTunes.

¿Qué es un Singleton?

Un singleton consiste en una clase que solo puede tener una instancia y provee de un punto global de acceso a ella. Para ello se crea una instancia de la clase la primera vez que se referencia, y se devuelve ésta en posteriores llamadas. Esto ayuda a crear clases reusables y no depender de variables globales.

Un claro ejemplo de uso es cuando diseñamos una clase para gestionar la conexion y querys con la base de datos. A lo largo de nuestro script crearemos instancias de esa clase, pero nos interesa que siempre sea la misma ya que todas las conexiones compartirán los mismos parámetros y solo cambiará el contenido del query, por lo que no necesitamos una nueva instancia cada vez, consiguiendo con ello una mejora en el rendimiento.

Ejemplo de implementación

class Singleton
{
	private static $singleInstancia;
 
	private function __construct(){ }
 
	public static function getInstancia(){
		if(!self::$singleInstancia){
			self::$singleInstancia = new self();
		}
		return self::$singleInstancia;
	}
 
        /* A partir de aquí vamos añadiendo los métodos la clase */
	function Metodo(){
		var_dump(self::$singleInstancia);
	}
 
}

Usaremos la clase de esta manera:

$mysingleton = Singleton::getInstancia();
$mysingleton->Metodo();

Para hacer nuestro singleton más robusto podríamos definir algunos de los metódos ‘mágicos’ de PHP para evitar el clonado y manejar la serialización, pero los he omitido para mantener la sencillez del ejemplo.

Relacionados:

13 comentarios para “Videotutorial: Patrones de diseño en PHP – Singleton Pattern”

  1. […] This post was mentioned on Twitter by programania, David Rojas. David Rojas said: Nuevo en el blog: 'Videotutorial: Patrones de diseño en PHP – Singleton Pattern' http://bit.ly/cjF8En […]

  2. Nicho dice:

    Oye pues que interesante está esto, comprendí la lógica de ello, pero aún necesitaría pensar en qué aplicarlo, ya que ahora que conosco codeigniter y que gracias a tí he aprendido mucho de él, pues ahora he estado elaborando algunas aplicaciones de manera rápida y sencilla.

  3. daniel dice:

    El patrón Singleton se aplica mucho en la conexión a la base de datos.

  4. Enrique dice:

    Hola, y cual es la diferencia con una clase estática? es decir, por qué no hacer todos los métodos estáticos y listo?

  5. David Rojas dice:

    @Enrique Con un singleton se crea una instancia única de una clase, que puede ser pasada como parámetro a otros métodos y tratada como un objecto normal. Las clases estáticas no pueden implementar interfaces, realmente es como si tuviéramos simplemente funciones, no sé si ves la diferencia. Piensa por ejemplo en cómo implementan la mayoría de los frameworks la capa de conexión a la base de datos, utilizando un singleton para crear la conexión con la BD y así reutilizar esa instancia.

  6. Enrique dice:

    Si, veia la diferencia, pero no veia la utilidad y ahora que lo mencionas creo que tener un objeto puede tener varias ventajas respecto a manejarse con una clase estática (implementar interfaces, heredar, pasarlo como parámetro, instanciarlo solo cuando lo necesitamos, etc).
    Gracias David!

  7. richard dice:

    Hola , Tengo una consulta digamos que tengo varias clases a las que quiero implementar el patron singleton ,entonces me pregunto si no seria mejor crear una clase llamada Singleton y pasarle el nombre de la clase como parametro al metodo getinstace, para que este lo guarde en un array , y asi no tener que escribirle el codigo a todas las clases ?

    y usarlo asi
    $SMyclase = singleton::getinstance(‘Myclase’);

    O existe algun otro patron que se encargue de esto.

    Saludos !

  8. Gloria Lucia dice:

    Cordial Saludo:
    Excelente video. Soy docente y lo estoy utilizando como material de clase,… claro está que te estoy dando tus créditos. Muchísimas gracias !!!
    Ojalá tener videos de los demás patrones.
    Hasta luego,
    Gloria Lucía.

  9. Eduardo dice:

    Buenas David. En el video explicas claramente el comportamiento y la diferencia sobre una clase tipo singleton y una clase comun. Actualmente estoy desarrollando un framework algo parecido a wordpress, los que programamos en wp sabemos que este cms utiliza variables globales del tipo global $post global $page $WP etc… creo que la forma mas optimizada hubiese sido que generaran todas estas variables dentro de un singleton y que este, este disponible en todo el cms. Por lo tanto en mi framework «The framework» he decidido aplicarlo. Creo que es un ejemplo mas de su utilizacion.
    Un saludo.

  10. Esta sensacional el video…….

  11. […] en: David Rojas […]

  12. Dario dice:

    Hola colegas, les comento, estoy haciendo un framework y me trabe en una parte…… es creando el boots que me va a mostrar los resultados en la vista.
    Logre que me muestre un dato de la base de datos remplazando con str_replace()…pero mi problema esta que cuando muestro el dato me abre el archivo que coloco en str_replace() -(al cual lo uso como cadena)- .. me lo abre tantas veces como se repita la iteracion de muestra de los datos de la DB.
    Espero poder haberme explicado bien…aca les dejo el script que me tiene que abrir la vista..

    public function reWriteFile($ruta, $file, $consult, $data) {

    /*metodo que me trae los datos de la base de datos */

    $dato = $this->helper->loadDataDB($consult, $data);

    $logitud = sizeof($dato);

    for ($i = 0; $i < $logitud; $i++) {

    $remplazador = "{$dato[$i][$data]} – Hello";

    //ubicamos el archivo para poder leerlo

    $filename = "skins/default/contents/" . $file . ".tpl.php";

    //lo leemos con la funcion file_get_content()

    $leer = file_get_contents($filename);

    //strstr encuentra una aguja en un pajar
    $remplazado = "{" . $data . "}";
    if (!strstr($leer, $remplazado)) {

    echo "No se logro encontrar la expresion regular » . $remplazado . «»;
    } else {

    $remplazo = str_replace($remplazado, $remplazador, $leer);

    }
    echo $remplazo;

    }

    }

    SI ALGUIEN ME DA UNA MANO PARA QUE ESE DATO SALGA CORRECTAMENTE Y QUE EL ARCHIVO NO SE ABRA TANTAS VECES COMO DATO ALLA EN LA BASE DE DATOS SE LO VOY A AGRADECER…:)

    Saludos y desde ya gracias por leerlo…

  13. Dario dice:

    Hola colegas, les comento, estoy desarrollando una aplicación en php y necesito solucionar un problemita que ya me esta sacando canas verdes, hace un tiempo largo que estoy con esto y nada….
    Resulta que mi aplicación esta distribuida en MODELO, VISTA y CONTROLADOR…. en el controlador están todas las librerías y hay un controlador que es quien comanda todas las lineas de códigos a ejecutar, incluyendo las librerías correspondientes….
    En la vista no existe ningún tipo de código php, solo es html y txt…. para ello el controlador es quien muestra los datos de la base de datos en el html remplazando los txt que le coloco, por ejemplo…en el html coloco {USUARIO} y en php controlador coloco un método que contenga str_replace() y que contenga los datos a remplazar ( str_replace($datosHTML,$datosController,$Cadena) )…….. mi problema esta en que los datos extraídos desde la base de datos los muestra en el html, pero fuera del div, como que no entendiera que tiene que ir ubicado dentro del div que contiene {USUARIO}… habrá otra forma extraer datos desde la base de datos y remplazarlos en html, y que cumplan un perfecto orden dentro del div?

    p/d =cabe aclarar que ese problema lo tengo cuando llamo los datos desde la base de datos y no cuando coloco una cadena simple «Hola mundo».

    Para mas ayuda, colocare mis metodos:

    PHP:

    Código:
    public function getTemplate($cadena, $code, $fill) {

    $archivo = «View/default/» . $fill . «.php»;

    $remplazo = file_get_contents($archivo);

    $remplazo = str_replace($cadena, $code, $remplazo);

    $fp = fopen($archivo, «r»);
    $write = fputs($fp, $remplazo);
    fclose($fp);
    //esto es metodo de la libreria singleton

    Controlador :

    Código:
    public function index() {

    $this->callLibrary(«Singleton»);
    $this->callLibrary(«Template»);

    $this->callMetod(new Template())->callView(«header»);

    $this->callMetod(Singleton::getInstacia())->getTemplate(
    array(
    «{fecha}», //dato a remplazar en el html
    «{titulo}»,
    «{detalle}»
    ),
    array(
    $this->date(),
    $this->post(«titulo»), //dato remplazador
    $this->post(«detalle»)),
    «content»);// archivo

    //siempre instanciando su clase podemos llamar al metodo
    // $this->callMetod(new Template())->callView(«content»);
    $this->callMetod(new Template())->callView(«footer»);
    }

    HTML Contenido

    Código:

    {titulo}
    {fecha}
    {detalle}

    Bueno gente espero que me puedan ayudar y muchas gracias por leer mi pregunta…saludos

Deja un comentario

Time limit is exhausted. Please reload the CAPTCHA.

RSS iTunes podcast Twitter

Categorías

Enlaces

Archivos