php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 01.12.2008, 17:21  
Neuer Benutzer
 
Registriert seit: 05.10.2008
Beiträge: 8
loobster befindet sich auf einem aufstrebenden Ast
Standard Destruktor / Instanz löschen

Hallo,

ich habe mal eine Frage zu dem Destruktor in PHP.
Dazu habe ich eine Klasse test geschrieben mit Konstruktor und Destruktor.

Ist das soweit richtig und für eine "saubere" Programmierung auch nötig ?

Am Ende des Skripts wird die geschaffene Instant "genullt" und per unset gelöscht. Ist das soweit auch richtig und nötig ?

Danke!!

PHP-Code:
<?php
class test
{
    private 
$a;
    private 
$b;
    
    function 
__construct()
    {
        
$this->5;
        
$this->10;
    }

    
    function 
__destruct()
    {
        unset(
$this->a);
        unset(
$this->b);
    }
}

$test_class = new test();

...
...

$test_class NULL;
unset(
$test_class);
?>
Noch eine kleine Frage: Ab welcher PHP-Version werden Exceptions und __destruct unterstützt ? Erst ab PHP5 ?

Geändert von loobster (01.12.2008 um 17:26 Uhr).
loobster ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 01.12.2008, 17:36  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Zitat:
Zitat von loobster
Am Ende des Skripts wird die geschaffene Instant "genullt" und per unset gelöscht. Ist das soweit auch richtig und nötig ?
Das beantworte ich mal mit einem entschiedenen: jein

Im Handbuch steht dazu
Zitat:
Zitat von http://uk2.php.net/manual/en/language.oop5.decon.php
The destructor method will be called as soon as all references to a particular object are removed or when the object is explicitly destroyed or in any order in shutdown sequence.
Mit
PHP-Code:
$test_class NULL
löst Du bereits die Referenz auf - gibt es keine weiteren Referenzen, sollte PHP das Objekt hier schon auf die Abschussliste setzen.
Das darauf folgende unset() hat dann also keinen Bezug mehr zu dem Objekt und damit auch keine Relevanz mehr, was den Destruktor angeht. Wenn Du die =NULL-Zeile streichst, räumt unset($test_class) die Referenz auf das Objekt auch ab.
Wenn der Sichtbarkeitsbereich einer Variablen verlassen wird, zum Beispiel
PHP-Code:
function foo() {
  
$x 1;
  
// Ende der Funktion. $x ist nur lokal definiert -> Ende des Sichtbarkeitsbereichs von $x

sollten Variablen auch abgeräumt werden. samt Referenzzähler und ggf. Aufruf von Destruktoren. "Sollten" weil ich schon öfter von Problemen gelesen habe. Wie das aktuell aussieht, weiß ich ehrlich gesagt nicht.
Das Ende der Skriptabarbeitung ist nochmal ein Sonderfall.
Zitat:
Zitat von http://uk2.php.net/manual/en/language.oop5.decon.php
Note: Destructors called during the script shutdown have HTTP headers already sent. The working directory in the script shutdown phase can be different with some SAPIs (e.g. Apache).
Note: Attempting to throw an exception from a destructor (called in the time of script termination) causes a fatal error.
Wenn Du also Objekte im globalen Namensraum "liegen lässt" und PHP sie deshalb automatisch am Ende abräumt, gelten ein bisschen andere Regeln.


Also kurz gesagt: die Zeile
Zitat:
$test_class = NULL;
kann raus.
Und auch erstmal nicht zu viel über Destruktoren nachdenken. In Deinem Skript sehe ich zum Beispiel gar keinen Grund dafür. PHP übernimmt in diesem Fall die Speicherverwaltung von sich aus.
David ist offline  
Alt 01.12.2008, 17:40  
Neuer Benutzer
 
Registriert seit: 05.10.2008
Beiträge: 8
loobster befindet sich auf einem aufstrebenden Ast
Standard

@David:
Danke für deine schnelle und ausführliche Antwort, dann werde ich das "=NULL" streichen

Aber der Destruktor innerhalb der Klasse hat seine Daseins-Berechtigung ?

PHP-Code:
function __destruct()
    {
        unset(
$this->a);
        unset(
$this->b);
    } 
loobster ist offline  
Alt 01.12.2008, 17:48  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

In Deinem Beispiel ist er überflüssig. Wie gesagt kümmert sich PHP an dieser Stelle selbst darum.
David ist offline  
Alt 01.12.2008, 18:57  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.988
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Der Destruktur dient nicht zum Löschen des Objekts, sondern zum Ausführen von Aktionen direkt vor dem Löschen desselben.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online  
Alt 01.12.2008, 21:06  
Neuer Benutzer
 
Registriert seit: 05.10.2008
Beiträge: 8
loobster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Der Destruktur dient nicht zum Löschen des Objekts, sondern zum Ausführen von Aktionen direkt vor dem Löschen desselben.
Ist es denn noch nötig die beiden Variablen zu löschen oder werden die dann automatisch mit der Zeile
PHP-Code:
unset($test_class); 
gelöscht ?
loobster ist offline  
Alt 01.12.2008, 21:08  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.988
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Letzteres. Es sei denn, Du rufst den Destruktor explizit auf. Was dann mit dem Objekt passiert, bin ich mir nicht ganz sicher.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online  
Alt 02.12.2008, 00:02  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Hast Du vorher eine Sprache ohne (automatische) Speicherverwaltung erlernt? C, C++ ?
David ist offline  
Alt 08.12.2008, 15:32  
Neuer Benutzer
 
Registriert seit: 05.10.2008
Beiträge: 8
loobster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von David Beitrag anzeigen
Hast Du vorher eine Sprache ohne (automatische) Speicherverwaltung erlernt? C, C++ ?
Jo, C++
loobster ist offline  
Alt 08.12.2008, 17:02  
Erfahrener Benutzer
 
Benutzerbild von Phoscur
 
Registriert seit: 01.12.2008
Beiträge: 450
PHP-Kenntnisse:
Fortgeschritten
Phoscur wird schon bald berühmt werdenPhoscur wird schon bald berühmt werden
Standard

Ich hab ma irgendwo gelesen, dass = NULL besser als unset sein soll, weil es den Speicher freigibt. Sorry wegen Threadmissbrauch, aber weiß jemand was dazu?

Mir fällt noch ein, dass man mit den ganzen Referenzen verdammt aufpassen und ggf. Flags und klaren Destruktoraufruf verwenden muss (Wenn man zum Beispiel selbst die Zerstörungsreihenfolge festlegen will...).
__________________
Phoscur ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
User mit PHP aus DB löschen MistaJ PHP Tipps 2008 10 01.12.2008 19:38
[Erledigt] Bestimmten Datensatz aus SESSION Array löschen! litterauspirna PHP Tipps 2008 13 27.08.2008 18:05
[Erledigt] Benutzer in phpbb löschen - per sql-Befehl Datenbanken 2 23.12.2005 09:52
Bilder löschen PHP Tipps 2005-2 4 24.10.2005 11:37
[Erledigt] Löschen aus Tabelle mit ID-Übergabe Datenbanken 8 20.10.2005 22:10
Vor dem löschen abfragen ob man wirklich löschen will PHP Tipps 2005-2 1 05.09.2005 11:54
Problem mit PFad Firefox - Verzeichnis löschen PHP Tipps 2005-2 0 19.07.2005 16:05
Verzeichnis löschen - falscher Webserverbenutzer ?! PHP Tipps 2005-2 11 09.07.2005 00:35
[FRAGE] Datein per PHP löschen. PHP Tipps 2005 21 11.05.2005 19:36
[Erledigt] Sicherheitsabfrage beim Löschen aus DB PHP Tipps 2005 6 05.04.2005 10:24
server probleme datei löschen Rotti PHP Tipps 2004-2 7 30.12.2004 13:51
Datei löschen mit unlink PHP Tipps 2004-2 4 30.11.2004 00:36
kompletten Ordner löschen??? 18inch PHP Tipps 2004 5 03.09.2004 09:52
Datensatz löschen: Destruktor / Instanz löschen? PHP Tipps 2004 9 09.06.2004 01:44

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php destructor, php objekt löschen, php instanz löschen, php destruktor, php object löschen, c objekt löschen, c instanz löschen, destructor php, php klasse löschen, destruktor php, php objekte löschen, php class destructor, php class delete, php class löschen, instanz löschen php, objekt löschen php, php destruktoren, objekt löschen c, destruktoren php, php objekt instanz löschen

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:35 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum