Destructores en PHP 5

  • Por
Explicación de los destructores en PHP5 y ejemplos de funcionamiento.

Los destructores son funciones que se encargan de realizar las tareas que se necesita ejecutar cuando un objeto deja de existir. Cuando un objeto ya no está referenciado por ninguna variable, deja de tener sentido que esté almacenado en la memoria, por tanto, el objeto se debe destruir para liberar su espacio. En el momento de su destrucción se llama a la función destructor, que puede realizar las tareas que el programador estime oportuno realizar.

La creación del destructor es opcional. Sólo debemos crearlo si deseamos hacer alguna cosa cuando un objeto se elimine de la memoria.

El destructor es como cualquier otro método de la clase, aunque debe declararse con un nombre fijo: __destruct().

En el código siguiente vamos a ver un destructor en funcionamiento. Aunque la acción que realiza al destruirse el objeto no es muy útil, nos puede servir bien para ver cómo trabaja.

class cliente{ 
   	var $nombre; 
   	var $numero; 
   	var $peliculas_alquiladas; 

   	function __construct($nombre,$numero){ 
      	$this->nombre=$nombre; 
      	$this->numero=$numero; 
      	$this->peliculas_alquiladas=array(); 
   	} 

   	function __destruct(){ 
      	echo "<br>destruido: " . $this->nombre; 
   	} 

   	function dame_numero(){ 
      	return $this->numero; 
   	} 
} 

//instanciamos un par de objetos cliente 
$cliente1 = new cliente("Pepe", 1); 
$cliente2 = new cliente("Roberto", 564); 

//mostramos el numero de cada cliente creado 
echo "El identificador del cliente 1 es: " . $cliente1->dame_numero(); 
echo "<br>El identificador del cliente 2 es: " . $cliente2->dame_numero();

Este código es igual que el anterior. Sólo se ha añadido el destructor, que imprime un mensaje en pantalla con el nombre del cliente que se ha destruido. Tras su ejecución obtendríamos la siguiente salida.

El identificador del cliente 1 es: 1
El identificador del cliente 2 es: 564
destruido: Pepe
destruido: Roberto

Como vemos, antes de acabar el script, se libera el espacio en memoria de los objetos, con lo que se ejecuta el destructor y aparece el correspondiente mensaje en la página.

Un objeto puede quedar sin referencias y por lo tanto ser destruido, por muchas razones. Por ejemplo, el objeto puede ser una variable local de una función y al finalizarse la ejecución de esa función la variable local dejaría de tener validez, con lo que debe destruirse.

El código siguiente ilustra cómo una variable local a cualquier ámbito (por ejemplo, local a una función), se destruye cuando ese ámbito ha finalizado.

function crea_cliente_local(){ 
   	$cliente_local = new cliente("soy local", 5); 
} 
crea_cliente_local()

La función simplemente crea una variable local que contiene la instanciación de un cliente. Cuando la función se acaba, la variable local deja de existir y por lo tanto se llama al destructor definido para ese objeto.

Nota: También podemos deshacernos de un objeto sin necesidad que acabe el ámbito donde fue creado. Para ello tenemos la función unset() que recibe una variable y la elimina de la memoria. Cuando se pierde una variable que contiene un objeto y ese objeto deja de tener referencias, se elimina al objeto y se llama al destructor.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

carajodida

07/7/2005
No entiendo... en ningun momento se destruyó el objeto o no entendi, esta el destructor pero cuando se llamo al destructor??

ben

06/3/2007
es automatico, implementala y pruebala. Tampoco se hizo una llamada a la funcion Construct

Evelyn

14/8/2007
Yo tampoco entendí, cuándo se supone que se destruye el objeto??.

Manumene

07/9/2007
A mi el sentido comun me dice q habría que ponerlo asi (ver al final) :

//instanciamos un par de objetos cliente
$cliente1 = new cliente("Pepe", 1);
$cliente2 = new cliente("Roberto", 564);

//mostramos el numero de cada cliente creado
echo "El identificador del cliente 1 es: " . $cliente1->dame_numero();
echo "<br>El identificador del cliente 2 es: " . $cliente2->dame_numero();

$cliente2->__destruct();

Si no nunca pasa por el destruct...
Corregirme si me equivoco...por q soy nuevo en esto...

Carlos

14/9/2007
Claramente no hace falta llamar a destruct, cuando haces new cliente ya se crea y destruye solita

Sergio M

30/12/2007
Lo que esta escrito esta perfecto. Agrego que es posible deshacernos del objeto con $objeto=NULL

JX

27/3/2009
hey tio no se porque pero me doy cuenta de q a esas variables le falta el $ ??? y no m funciona el code

Fatal error: Cannot access empty property in C:AppServwwwPHPIncludesClasesclass_cliente.php on line 12

Daniel

19/9/2009
Destructor
Me parece bueno el uso de destrutores ya que al tener variables que no se necesitan mas en memoria es importante destruirlas. Esto no se ve muy claro en la ejecucion de programas pequeños pero a medida que el uso de un programa aumenta es importante el matenimiento lo cual incluye deshacerse de las variables de holgura que pueda existir. Agradesco la discucion de este tipo de temas ya es muy importante su comprencion..

Sebastián Leal

23/3/2011
Pequeño comentario
Cuando uno viene por primera vez a esta página, la parte "...Este código es igual que el anterior..." no es muy clara ya que uno no ha visto la anterior. Sería bueno agregar una link.
Gracias por el artículo.

Nessa

30/5/2011
RE: Pequeño comentario
El enlace que pides ya existe. Al final de la página hay dos flechas que te dirigen a la anterior página del manual y a la siguiente, respectivamente.

sebastian

01/6/2011
OJO! con PHP menor que 5.3
Hay un bug de PHP que no libera la memoria vean este link http://bugs.php.net/bug.php?id=33595.
Con la version 5.3 si pude liberar memoria de forma mas o menos efectiva.

turcosuizo

29/10/2011
El código está bien
Lo que ocurre es que la mayoría de ustedes no sabe que cuando el programa termina su ejecusión, antes de terminar, libera toda la memoria y por lo tanto destruye los objetos creados, sin necesidad de destruirlos manualmente. En otras palabras, lo que ha hecho el editor del artículo, es dejar que estos objetos se destruyan solitos cuando el programa llega al final de su ejecusión. (no tiene sentido que NO DESTRUYA objetos que ya no se usan porque no hay más código que los use).

sgsm.co

09/1/2012
Aclarando temas
__construct
Se ejecuta de forma automática al instanciar una clase. Antes era la funcion que se llamaba de igual forma que la clase. Solo es necesario definirla si nuestra clase necesita realizar algo en el inicio, ejemplo: inicializar las variables con valores determinados.

__destruct
Si existe (puede no definirse), se ejecuta en el momento de destruir la clase de forma automática. Esto puede ser util, por ejemplo, para guardar los datos de la clase en DB de forma automática.