2010-07-15 11 views
10

Kann eine PHP-Objektinstanz sich selbst zerstören/löschen? Angenommen, ich hätte eine Klasse, die eine Datei repräsentiert, und dann lösche ich diese Datei anschließend mit der Klasse. Kann ich die Instanz irgendwie aus einer ihrer eigenen Methoden entfernen?Kann eine Klasseninstanz sich selbst zerstören?

$file = new FileClass(); 

$file->copy('/some/new/path/'); 
$file->delete(); 

// ... at this point $file would be seen as unset. 
+1

gab eine „Ja-und-hier-ist-how“ Antwort auf eine im Wesentlichen ähnliche Frage hier - http://stackoverflow.com/a/21367011/1537018 –

Antwort

14

Nein, es ist nicht möglich, eine Klasse zu zerstören, die unlogisch ist. unset($this) wird nicht funktionieren (zumindest nicht wie erwartet).

Warum nicht

unset($file); 

verwenden und definieren eine __destruct Funktion, in der Sie die Aufgaben ausführen, die Sie normalerweise in delete durchführen würde?

+0

Das war etwas, das ich in Betracht gezogen habe. Das einzige Problem bei diesem Ansatz wäre natürlich die Lesbarkeit. Ein Blick zurück auf diesen Code 5 Jahre später, oder jemand, der es zum ersten Mal betrachtet, hätte keine Möglichkeit zu wissen, unset() zu nennen, löschte tatsächlich die Datei. – Wilco

+1

Ich denke, das ist wirklich die beste Lösung, die gefunden werden kann, also werde ich es als die akzeptierte Antwort markieren. – Wilco

0

dass die einzige Lösung ist, die ich denken kann:

function delete($var_name) { 
    unset($GLOBALS[$var_name]); 
} 

Dann tun Sie:

$file->delete('file'); 

Wie auch immer, eine Klasse kann nicht Selbstmord (ohne Hilfe von außen).

+6

wird nicht funktionieren, wenn '$ file' nicht im globalen Bereich ist allerdings –

+0

' global $ {$ var_name} Hinzufügen; 'lösen sollte, dass – xorinzor

+1

den Umfang Zunehmende von einem Wert, um es Müll gesammelt zu bekommen, ist rückwärts. Wenn Sie global machen, treten Konflikte mit vorhandenen Werten mit demselben Namen auf, und es wird mehr Code für den Zugriff und damit für den Wert verwendet. Dies macht es * schwieriger * zu entfernen. Ihre Lösung wird den Wert zusammen mit anderen globalen "Dateien" entfernen (die bereits vorhanden sind oder noch hinzugefügt werden sollen) und andere Benutzer mit diesen Werten brechen. – Warbo

4

Alternativ können Sie den Bereich von $ Datei begrenzen, damit es Müll gesammelt wird, wenn nicht mehr verwendet:

call_user_func(function() { 
    $file = new FileClass(); 
    $file->copy('/some/new/path/'); 
    $file->delete(); 
}); 

// ... at this point $file would be seen as unset. 
Verwandte Themen