Destructor (__destruct)
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 8 de 91.
El método __destruct es un método especial que se llama automáticamente cuando un objeto es destruido. Un objeto se destruye cuando no hay más referencias a él o cuando el script finaliza.
Aquí hay un ejemplo de una clase con un constructor y un destructor:
<?php
class Resource {
public $name;
public function __construct($name) {
$this->name = $name;
echo $this->name . " was created\n";
}
public function __destruct() {
echo $this->name . " was destroyed\n";
}
}Crea un objeto y observa el ciclo de vida:
echo "=== Start ===\n";
$r = new Resource("Connection");
echo "Using " . $r->name . "\n";
unset($r); // destruir explícitamente el objeto
echo "=== End ===\n";Salida:
=== Start ===
Connection was created
Using Connection
Connection was destroyed
=== End ===La función unset() elimina la referencia al objeto, activando el destructor inmediatamente.
Si no llamas a unset(), el destructor se ejecuta automáticamente cuando el script finaliza:
$r = new Resource("Logger");
echo "Working...\n";
// __destruct se llama automáticamente al final del scriptSalida:
Logger was created
Working...
Logger was destroyedPunto clave: El método __destruct es útil para tareas de limpieza como cerrar archivos, liberar recursos o realizar registros cuando un objeto ya no es necesario.
Desafío
IntermedioCompleta la clase Resource en resource.php:
- Agrega un método
__constructque reciba$name, lo asigne como una propiedad e imprima"[name] was created" - Agrega un método
logMessageque reciba$messagee imprima"Log: [message]" - Agrega un método
__destructque imprima"[name] was destroyed"
El archivo driver.php probará el ciclo de vida de tus objetos Resource.
Hoja de referencia
El método __destruct se llama automáticamente cuando un objeto es destruido (cuando no hay más referencias a él o cuando el script finaliza).
Ejemplo de una clase con constructor y destructor:
<?php
class Resource {
public $name;
public function __construct($name) {
$this->name = $name;
echo $this->name . " was created\n";
}
public function __destruct() {
echo $this->name . " was destroyed\n";
}
}La función unset() elimina la referencia a un objeto, activando el destructor inmediatamente:
$r = new Resource("Connection");
unset($r); // destruir explícitamente el objetoSi no se llama a unset(), el destructor se ejecuta automáticamente cuando el script termina.
El método __destruct es útil para tareas de limpieza como cerrar archivos, liberar recursos o registrar eventos.
Pruébalo tú mismo
<?php
require_once 'resource.php';
$testCase = trim(fgets(STDIN));
if ($testCase == "basic_test") {
echo "=== Start ===\n";
$r = new Resource("FileHandler");
echo "Using " . $r->name . "\n";
unset($r);
echo "=== End ===\n";
} elseif ($testCase == "auto_destruct_test") {
$r = new Resource("Logger");
$r->logMessage("Application started");
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - Calculadora de Formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeResumen - Colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy