Constructores y destructores en PHP
Por Iván Bustos en PHP. Actualizado: 26/5/2011. Visitado 1313 veces. Compartir en FacebookTwitterLinkedIn
Dificultad: Principiante.
Requerimientos: El lector deberá tener conocimientos básicos de PHP.
Tiempo estimado para completar: 30 minutos.
Probablemente ya conozcas el concepto de métodos constructores que ofrecen los lenguajes de programación orientados a objetos. En caso de que no estés al día aún, el concepto es bastante simple. Un constructor es aquel método que se ejecutará al momento de crear una instancia de un objeto. Un destructor por el otro lado, es un método que se ejecutará cada vez que el objeto sea destruido.
Generalmente los programadores usamos los constructores para inicializar propiedades o variables miembro así como aceptar parámetros que son críticos para el correcto funcionamiento de los demás métodos miembros del objeto. También usamos destructores (aunque este último no es tan común en ciertos lenguajes. No existe este concepto en Java) para generalmente limpiar y recuperar recursos. Muchas veces este último método es pasado por alto y con buena razón; los intérpretes generalmente hacen un buen trabajo destruyendo objetos a medida que no son usados. Sin embargo, en ciertos casos es crítico usarlo, por ejemplo si queremos cerrar una conexión con una base de datos.
Desde PHP5, el lenguaje ha incorporado un nuevo método para crear constructores y destructores. Tradicionalmente en programación orientada a objetos, tanto los constructores como los destructores comparten el mismo nombre de la clase o del objeto. En PHP5 sin embargo, los creadores decidieron darle un nombre específico a estos procedimientos. __construct() y __destruct() permiten definir nuestos constructores y destructores. Obviamente, sólo se permite uno de cada uno por clase. Este nuevo cambio me encanta por que facilita muchísimo el cambio de nombres, también conocido como refactorización.
Considera el siguiente ejemplo:
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Prueba</title>
- </head>
- <body>
- <?php
- class MiObjeto
- {
- private $miVariable;
- public function __construct($valor)
- {
- $this->miVariable = $valor;
- }
- public function __destruct()
- {
- $this->guardar();
- }
- public function guardar()
- {
- echo("<p>Estoy guardando \$miVariable cuyo valor actual es " . $this->miVariable . " a la base de datos...</p>");
- }
- }
- $p = new MiObjeto(3);
- unset($p);
- $p2 = new MiObjeto(7);
- die ("<p>Algo salió mal.</p>");
- ?>
- </body>
- </html>
Al ejecutar el código anterior, obtendremos algo como lo siguiente:

Nuestra clase MiObjeto tiene una variable miembro llamada $miVariable y un método miembro llamado guardar() (en la línea 20) que simplemente "guarda" el valor de la variable en una supuesta base de datos. La implementación en este ejemplo obviamente es lo de menos. Nota por favor las líneas resaltadas del código anterior. Observarás que nuestra clase tiene su propio método constructor, el cual toma un parámetro $valor y se lo asigna a $miVariable. Cada vez que inicialicemos un objeto con clase MiObjeto, este método será ejecutado como por arte de magia. De la misma manera, hemos declarado un método destructor (en la línea 16) que simplemente hace una llamada a nuestro método guardar().
Observa ahora la línea 25 del código anterior. Creamos en esta un objeto $p de clase MiObjeto y le asignamos un valor de 3 como parámetro. Esto ejecutará el método constructor detrás de las cortinas de manera automática y asignará 3 a nuestra variable $miVariable.
PHP ofrece un método para destruir objetos llamado unset(). Tan sólo le damos el nombre del objeto que queremos destruir. Mira por ejemplo la línea 26 del código. Al hacer esto habremos destruido nuestro objeto $p y tal y como lo esperabas, PHP ejecutará nuestro método guardar() que es llamado inmediatamente por nuestro destructor.
Nota que incluso después de matar por completo la aplicación (línea 28), aún nuestro destructor es llamado.
Fotografía de maquinaria de construcción usada bajo licencia Creative Commons 2.5 http://www.freefoto.com/preview/21-09-2
Iván Bustos, un desarrollador web en Colombia con más de 10 años de experiencia en el desarrollo de experiencias en línea, enamorado de los estándares web y del poder de JavaScript. Fundador de Estilocss.com y creador de IBForm.
El 5 de abril de 2011, Juan Bustos dijo:
Gracias por este tutorial, me va a ser muy util la proxima vez que haga algo en PHP.
El 2 de mayo de 2011, Pedro Hernández dijo:
muy buen sitio; me gusta.