21 - Método destructor de una clase (__destruct)


Otro método que se ejecuta automáticamente es el __destruct (destructor de la clase)

Las características de este método son:

  • El objetivo principal es liberar recursos que solicitó el objeto (conexión a la base de datos, creación de imágenes dinámicas etc.)
  • Es el último método que se ejecuta de la clase.
  • Se ejecuta en forma automática, es decir no tenemos que llamarlo.
  • Debe llamarse __destruct.
  • No retorna datos.
  • Es menos común su uso que el constructor, ya que PHP gestiona bastante bien la liberación de recursos en forma automática.

Para ver su sintaxis e implementación confeccionaremos el siguiente problema: Implementar una clase Banner que muestre un texto generando un gráfico en forma dinámica. Liberar los recursos en el destructor. En el constructor recibir el texto publicitario.

<?php
class Banner {
  private $ancho;
  private $alto;
  private $mensaje;
  private $imagen;
  private $colorTexto;
  private $colorFondo;
  public function __construct($an,$al,$men)
  {
    $this->ancho=$an;
    $this->alto=$al;
    $this->mensaje=$men;
    $this->imagen=imageCreate($this->ancho,$this->alto);
    $this->colorTexto=imageColorAllocate($this->imagen,255,255,0);
    $this->colorFondo=imageColorAllocate($this->imagen,255,0,0);
    imageFill($this->imagen,0,0,$this->colorFondo);
  }
  public function graficar()
  {
    imageString ($this->imagen,5,50,10, $this->mensaje,$this->colorFuente);
    header ("Content-type: image/png");
    imagePNG ($this->imagen);
  }
  public function __destruct()
  {
    imageDestroy($this->imagen);
  }
}

$baner1=new Banner(428,45,'Sistema de Ventas por Mayor y Menor');
$baner1->graficar();
?> 

Se trata de un archivo PHP puro ya que se genera una imagen PNG y no un archivo HTML.

Al constructor llega el texto a imprimir y el ancho y alto de la imagen. En el constructor creamos el manejador para la imagen y creamos dos colores para la fuente y el fondo del banner.

  public function __construct($an,$al,$men)
  {
    $this->ancho=$an;
    $this->alto=$al;
    $this->mensaje=$men;
    $this->imagen=imageCreate($this->ancho,$this->alto);
    $this->colorTexto=imageColorAllocate($this->imagen,255,255,0);
    $this->colorFondo=imageColorAllocate($this->imagen,255,0,0);
    imageFill($this->imagen,0,0,$this->colorFondo);
  }

El método graficar genera la imagen dinámica propiamente dicha:

  public function graficar()
  {
    imageString ($this->imagen,5,50,10, $this->mensaje,$this->colorFuente);
    header ("Content-type: image/png");
    imagePNG ($this->imagen);
  }

Y por último tenemos el destructor que libera el manejador de la imagen:

  public function __destruct()
  {
    imageDestroy($this->imagen);
  }

Cuando creamos un objeto de la clase Banner en ningún momento llamamos al destructor (se llama automáticamente previo a la liberación del objeto:

$baner1=new Banner(428,45,'Sistema de Ventas por Mayor y Menor');
$baner1->graficar();

Retornar