Usando __destruct() en PHP 7

Junto con el constructor, el destructor es una característica común del lenguaje OO. El método mágico destruct() representa este concepto. El método se activa tan pronto como no haya otras referencias a un objeto en particular. Esto puede suceder cuando PHP decide liberar explícitamente el objeto, o cuando lo forzamos utilizando la construcción del lenguaje unset(). Al igual que con los constructores, PHP no llama implícitamente a los destructores principales. Para ejecutar un destructor padre, necesitamos llamar explícitamente parent::destruct(). Además, la clase secundaria hereda el destructor del padre si no implementa uno por sí mismo.
Digamos que tenemos una siguiente clase de usuario simple:

<?php
class User
{
public function __destruct()
{
echo '__destruct';
}
}

Con la clase Usuario en su lugar, sigamos adelante y veamos ejemplos de creación de instancias:

echo 'A';
new User();
echo 'B';
// outputs "A__destructB"

La expresión new User(); aquí instancia una instancia de la clase User en el aire ya que no asigna el objeto recién instanciado a la variable. Este es un disparador para que PHP llame explícitamente al método __destruct() allí mismo en la misma línea, lo que resulta en la salida de la cadena A__destructB:

echo 'A';
$user = new User();
echo 'B';
// outputs "AB__destruct"

La expresión new User() aquí crea una instancia de la clase User en la variable $user. Esto evita que PHP se active instantáneamente, ya que el script podría usar la variable $user más adelante en el camino. Aún así, PHP llama explícitamente al método __destruct() cuando concluye que la variable $user no está siendo referenciada, lo que resulta en la salida de la cadena AB__destruct:

echo 'A';
$user = new User();
echo 'B';
unset($user);
echo 'C';
// outputs "AB__destructC"

Aquí, estamos ampliando un poco el ejemplo anterior. Estamos usando unset()
construcción del lenguaje para forzar la destrucción de la variable $user entre expresiones.
La llamada a unset() es básicamente un disparador implícito para que PHP ejecute el
método __destruct() del objeto, que da como resultado la salida de cadena AB__destructC:

echo 'A';
$user = new User();
echo 'B';
exit;
echo 'C';
// outputs "AB__destruct"

Aquí, estamos llamando a la construcción del lenguaje exit() justo antes de la salida de la cadena C. Esto sirve como un desencadenante implícito para PHP de que no hay más referencias hacia la variable $user y, por lo tanto, se puede ejecutar el método __destruct() del objeto. El resultado resultante es la cadena AB__destruct.
Ciertas situaciones pueden tentarnos a llamar al constructor exit() desde el propio método __destruct(). Nunca deberíamos hacer esto, porque llamar a exit() dentro de __destruct() impide que se ejecuten las rutinas de apagado restantes.
Del mismo modo, lanzar una excepción desde el método __destruct() provocará un error fatal, pero solo si se produce en el momento de la finalización del script. Esta no es, de ninguna manera, una forma de manejar nuestros estados de aplicación.

La mayoría de las veces, los destructores no son algo que queremos o necesitamos implementar por nuestra cuenta. Lo más probable es que la gran mayoría de nuestras clases no lo necesiten, ya que PHP hace un buen trabajo de limpieza. Sin embargo, hay casos en los que podríamos querer liberar instantáneamente el recurso consumido por el objeto después de que el objeto ya no esté siendo referenciado. El método __destruct() permite ciertas acciones de seguimiento durante la terminación del objeto.

Comparte