Destruktor (__destruct)
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 8 von 91.
Die __destruct-Methode ist eine spezielle Methode, die automatisch aufgerufen wird, wenn ein Objekt zerstört wird. Ein Objekt wird zerstört, wenn es keine Referenzen mehr darauf gibt oder wenn das Skript endet.
Hier ist ein Beispiel für eine Klasse mit sowohl einem Konstruktor als auch einem Destruktor:
<?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";
}
}Erstellen Sie ein Objekt und beobachten Sie den Lebenszyklus:
echo "=== Start ===\n";
$r = new Resource("Connection");
echo "Using " . $r->name . "\n";
unset($r); // das Objekt explizit zerstören
echo "=== End ===\n";Ausgabe:
=== Start ===
Connection was created
Using Connection
Connection was destroyed
=== End ===Die Funktion unset() entfernt die Referenz auf das Objekt und löst den Destruktor sofort aus.
Wenn Sie unset() nicht aufrufen, wird der Destruktor automatisch ausgeführt, wenn das Skript beendet ist:
$r = new Resource("Logger");
echo "Working...\n";
// __destruct wird am Ende des Skripts automatisch aufgerufenAusgabe:
Logger was created
Working...
Logger was destroyedWichtiger Punkt: Die __destruct-Methode ist nützlich für Aufräumarbeiten wie das Schließen von Dateien, das Freigeben von Ressourcen oder das Protokollieren, wenn ein Objekt nicht mehr benötigt wird.
Aufgabe
MittelVervollständigen Sie die Klasse Resource in resource.php:
- Fügen Sie eine
__construct-Methode hinzu, die$nameentgegennimmt, diesen als Eigenschaft setzt und"[name] was created"ausgibt. - Fügen Sie eine
logMessage-Methode hinzu, die$messageentgegennimmt und"Log: [message]"ausgibt. - Fügen Sie eine
__destruct-Methode hinzu, die"[name] was destroyed"ausgibt.
Die Datei driver.php wird den Lebenszyklus Ihrer Resource-Objekte testen.
Spickzettel
Die Methode __destruct wird automatisch aufgerufen, wenn ein Objekt zerstört wird (wenn es keine Referenzen mehr darauf gibt oder wenn das Skript endet).
Beispiel für eine Klasse mit Konstruktor und Destruktor:
<?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";
}
}Die Funktion unset() entfernt die Referenz auf ein Objekt und löst den Destruktor sofort aus:
$r = new Resource("Connection");
unset($r); // das Objekt explizit zerstörenWenn unset() nicht aufgerufen wird, wird der Destruktor automatisch ausgeführt, wenn das Skript beendet ist.
Die Methode __destruct ist nützlich für Aufräumarbeiten wie das Schließen von Dateien, das Freigeben von Ressourcen oder das Protokollieren.
Probier es selbst
<?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");
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung